转换值为255的char导致unsigned int值为4294967295,是什么给出的?

时间:2012-11-05 03:24:43

标签: c++ casting

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

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

输出:

4294967295

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

系统:Ubuntu 12.04 64位

g ++版本:4.6.3

1 个答案:

答案 0 :(得分:8)

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

然后值符号扩展为32位int,得到32位(但值相同,-1)。最后,该值转换为unsigned int。根据减少模2 32 -1所做的规则,它给出了最大可能的32位数(4294967295)。