以下代码在eclipse中执行,在Ubuntu上运行并使用g ++编译器编译时,会提供意外结果。
#include <iostream>
int main()
{
unsigned int a=5555;
std::cout << (unsigned int)(((char*)&a)[0]) << "\n";
std::cout << (unsigned int)(((char*)&a)[1]) << "\n";
std::cout << (unsigned int)(((char*)&a)[2]) << "\n";
std::cout << (unsigned int)(((char*)&a)[3]) << "\n";
return 0;
}
我试图将变量a
视为每个字节大小的整数数组。当我执行程序时,这就是我得到的输出:
4294967219
21
0
0
为什么第一个值显示得如此之大(这里int
的大小为32位或4个字节)。那么每个输出值显然应该不大于255对吗?为什么最后三个值为零?或者为什么我得到了错误的结果?
在code :: blocks中测试时,我也得到了相同的结果,运行相同的编译器。
答案 0 :(得分:6)
这是因为char
是有符号整数类型。
十进制5555是十六进制0x15b3
。
符号扩展为0xb3
时,signed int
字节变为0xffffffb3
。
0xffffffb3
的 unsigned int
为十进制的4294967219。
答案 1 :(得分:5)
这是因为符号扩展。让我们看一下你在内存中的unsigned int a
:
b3 15 00 00
当您将signed char
的第一个字节转换为unsigned int
时,从char
到int
的转换发生在从signed
转换为unsigned
之前{1}},因此,符号位被扩展,结果(0xffffffb3
)就是您在第一行看到的内容。
尝试转换为unsigned char *
而不是char *
。