c++ - 转换一个值为 255 的 char 会导致 unsigned int 值为 4294967295,这是什么原因?

标签 c++ casting

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

#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

最佳答案

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

然后 that 值被符号扩展为 32 位 int,给出 32 个 1 位(但相同的值,-1).最后,该值被转换为 unsigned int。根据以 232-1 为模的约简规则,给出最大可能的 32 位数 (4294967295)。

关于c++ - 转换一个值为 255 的 char 会导致 unsigned int 值为 4294967295,这是什么原因?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13225538/

相关文章:

c++ - 限制c++中 vector 的增长

c++ - 如何根据 boost 版本有选择地包含 boost header

c++ - 我不明白 C++ 中的段错误

c++ - 有没有一种方法总是比主模板更喜欢部分特化?

swift - 将 [NSURL] 转换为 NSUserDefaults 的 [String]?

c++ - 如何计算图像的分辨率?

java - 我应该如何将小数部分分配给来自 Talend 中 tFileInputPositional 的 BigDecimal?

xcode - Swift:如何将协议(protocol)类型转换为特定协议(protocol)?

c++ - 非常奇怪的转换错误

java - (Java) 为什么 Math.ceil(15/10) 是 1.0 而不是 2.0?