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

Chu*_*k R 2 c++ casting

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

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

输出:

4294967295
Run Code Online (Sandbox Code Playgroud)

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

系统:Ubuntu 12.04 64位

g ++版本:4.6.3

Jer*_*fin 8

char显然签了名.这意味着它255正在溢出char.因为你显然是在2的补码机器上,所以255的位模式存储在char(即所有位都被置位).当解释为带符号的8位数时,则为-1.

然后将该值符号扩展为32位int,给出32位(但值相同-1).最后,该值转换为unsigned int.据至由还原模2所做的规则32 -1,这给了最大可能的32位数字(4294967295).