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

时间:2011-04-07 09:12:20

标签: c++ visual-studio-2010

我遇到了一个有点奇怪的问题 - 我有一个char数组,我想输出为十六进制。我不介意作为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来自Juan Soulie友情提供的CRaster [1]类

IDE是Microsoft Visual C ++ 2010 Express,它会自动执行#include“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;

}

现在输出正确。

3 个答案:

答案 0 :(得分:1)

不是这个:

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

但是这个:

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

可能有用。

当您将字节值转换为(带符号)int时,字节的符号位(高位)会传播以填充整数的上半部分。所以(比方说)0x80的字节变成像0xffffff80这样的int。无符号算术会产生您想要的行为。

答案 1 :(得分:1)

问题是您机器上的普通字符已签名。 (如果 你不太关心g ++和VC ++的可移植性 有选项使普通字符无符号。)你需要先 将char转换为unsigned char,然后将unsigned char转换为 INT。或者,如果您可以更改数据结构 输出,更改它们以使用unsigned char;这似乎更多 适用于像位图这样的东西。

答案 2 :(得分:0)

使用此行:

unsigned char tmp = bmp.Raster[i];

而不是:

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

它可能会奏效。