[英]Why is this program's output unexpected?
以下代码在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中测试时,我也得到了相同的结果。
这是因为char
是带符号的整数类型。
十进制5555是十六进制0x15b3
。
当将0xb3
字节符号扩展为一个有signed int
,它变为0xffffffb3
。
解释为unsigned int
0xffffffb3
以十进制表示为4294967219。
这是由于符号扩展。 让我们看看您的unsigned int a
内存:
b3 15 00 00
当您将第一个字节从有signed char
转换为unsigned int
,从char
到int
的转换发生在从signed
到unsigned
的转换之前,因此,对符号位进行了扩展,结果是( 0xffffffb3
)您的第一行。
尝试强制转换为unsigned char *
而不是char *
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.