为什么这个程序的输出意外?

时间:2016-02-16 03:06:59

标签: c++ eclipse

以下代码在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中测试时,我也得到了相同的结果,运行相同的编译器。

2 个答案:

答案 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时,从charint的转换发生在从signed转换为unsigned之前{1}},因此,符号位被扩展,结果(0xffffffb3)就是您在第一行看到的内容。

尝试转换为unsigned char *而不是char *