将char *转换为int会产生奇怪的错误

Casting char * as int gives strange error

本文关键字:错误 char 转换 int      更新时间:2023-10-16

我遇到了一个有点奇怪的问题-我有一个字符数组,我想输出为十六进制。我不介意将其转换为int,但当我这样做时,会在一些数字前面添加很多f。我用下面的代码为我输出:

for (int i = 0; i<(bmp.BytesPerRow*bmp.Height);i++) // once per color per pixel
{
    if(i%3==0) // one line between each pixel
    {
        cout << "n";
    }
int tmp = (int) bmp.Raster[i];
cout << "nbmp.Raster[" << i << "]": " << hex << tmp;
}

和我的输出看起来像这样:

bmp.Raster[0]: ffffffff
bmp.Raster[1]: ffffffff
bmp.Raster[2]: ffffffff
bmp.Raster[3]: 40
bmp.Raster[4]: 20
bmp.Raster[5]: ffffffe0
bmp.Raster[6]: 40
bmp.Raster[7]: ffffffe0
bmp.Raster[8]: 20
etc...

老实说,我不明白。如果是

我可以理解
ff
ff
ff
40
20
e0
etc...

和我可以理解,如果f被附加到一切(我认为这是铸造过程的一个工件,只是丢弃前6个输出),但只有一些?我不明白。

额外的信息:

bmp。Raster来自class caster[1],由Juan Soulie提供。

IDE是Microsoft Visual c++ 2010 Express,它自动包含"tchar.h",但我试过注释该库,但奇怪的是仍然存在。

[1] http://www.cplusplus.com/files/winbmp.zip编辑:你们中的一些人为解决方案提供了建议——我很感激——但我在这里主要是问是否有人知道到底发生了什么?

再次编辑:问题已由James Kanze解决。

循环已更改为:

for (int i = 0; i<(bmp.BytesPerRow*bmp.Height);i++) // once per color per pixel
{
    if(i%3==0) // one line between each pixel
    {
        cout << "n";
    }
uint8_t tmp0 = (uint8_t)bmp.Raster[i];
uint16_t tmp1 = (uint16_t)tmp0;
cout << "nbmp.Raster[" << i << "]": " << hex << tmp1;
}

和输出现在是正确的

问题是机器上的普通字符是有符号的。(如果你不太关心可移植性,无论是c++还是vc++有选项使普通字符无符号。)你需要首先将该char转换为unsigned char,然后将该unsigned char转换为int。或者,如果你可以改变数据结构输出时,将它们改为使用unsigned char;这似乎更多

Not this:

int tmp = (int) bmp.Raster[i];

但这:

int          tmp = (unsigned int) bmp.Raster[i];   // OR
unsigned int tmp =                bmp.Raster[i];

当您将字节值强制转换为(有符号)int时,字节的符号位(高阶位)被传播以填充整数的上半部分。所以一个字节(比如)0x80变成了像0xffffff80这样的整型。无符号算术产生您想要的行为。

使用这一行:

unsigned char tmp = bmp.Raster[i];

代替:

int tmp = (int) bmp.Raster[i];

它可能会起作用。