将char *转换为int会产生奇怪的错误
Casting char * as int gives strange error
我遇到了一个有点奇怪的问题-我有一个字符数组,我想输出为十六进制。我不介意将其转换为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];
它可能会起作用。
相关文章:
- 在没有定义返回类型的函数中返回布尔值,并将结果保存在无错误的char编译中-为什么
- strncpy之后的char数组的错误行为
- C++错误:初始值设定项过多,无法'char[26]'
- 需要帮助在 c++ 中将字符串转换为字符 ----错误 "const char *" 类型的值不能用于初始化 "char" 类型的实体
- 使用 char* 存储数据和产生的错误
- 为什么将指针重新分配给 1D 数组的 char 时显示错误,但 2D 数组工作正常?
- JavaCPP 错误:无法将参数"1"的"char*"转换为"Abc*
- C++错误:无法将参数 2 从 'char' 隐蔽到 char[]'
- 当我尝试通过构造函数分配 char 数组时出现错误
- 将错误作为从字符串常量到"char*"的已弃用转换 [-Wwrite-strings]
- 获取"rw_ssid"中成员"长度"的错误请求,该成员属于非类类型"char*"
- 如何摆脱C++中未解析的外部符号"private: static char"错误?
- C++ [错误] 声明'char '隐藏参数。什么意思?
- 错误LNK2019未解析的外部符号"public: __thiscall SLinkList<char>::SLinkList<char>(void)"
- 错误:请求成员 .. 是非类类型"char"
- 使用 rapidxml::xml_node::first_attribute 时出现分段错误<char>
- C++错误 - 'char' 和'int'之前的预期主表达式
- 为什么 std::cin 没有给出错误"char"
- 错误:“char(CharStack::)()const throw(CharStack:Underflow)”类型的参
- 错误:char*类型的参数与LPCWSTR类型的参数不兼容