好的,这是我以前从未见过的一个奇怪的问题:
#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
答案 0 :(得分:8)
您的char
显然已签名。这意味着255
溢出了char
。由于您显然是在2的补码机器上,因此255的位模式存储在char
中(即,所有位都已设置)。当解释为带符号的8位数时,则为-1。
然后将值符号扩展为32位int
,得到32位(但值相同,-1
)。最后,该值转换为unsigned int
。根据减少模2 32 -1所做的规则,它给出了最大可能的32位数(4294967295)。