2

好的,这是一个我从未见过的奇怪问题:

#include <iostream>
int main()
{
  char testchar = 255;
  std::cout << (unsigned int)testchar << std::endl;
}

输出:

4294967295

到底是什么?似乎因为 char 是“满的”,所以当它生成新的 unsigned int 类型时,结果也是“满的”。这不是我记得的或我期望的结果。我希望 unsigned int 的值为 0x000000FF。任何人都可以向我解释到底发生了什么吗?

系统:Ubuntu 12.04 64 位

g++ 版本:4.6.3

4

1 回答 1

8

char的显然已签名。这意味着255溢出char。由于您显然是在 2 的补码机器上,因此 255 的位模式存储在char(即所有位都已设置)中。当解释为带符号的 8 位数字时,即为 -1。

然后将该值符号扩展为 32-bit int,给出 32 个 1 位(但值相同,-1)。最后,该值转换为unsigned int。根据通过减少模 2 32 -1 完成的规则​​,它给出了最大可能的 32 位数 (4294967295)。

于 2012-11-05T03:30:01.437 回答