签名为无符号转换

时间:2011-08-11 17:22:01

标签: bit-manipulation unsigned signed

任何人都可以解释为什么以下代码输出它的作用:

char c = -1;
cout << (c << 8) << endl;
cout << ((unsigned char) c << 8) << endl;
cout << (c << 24) << endl;
cout << ((unsigned char) c << 24) << endl;

输出:

-256
65280
-16777216
-16777216

我认为转换为unsigned char只会改变比特的解释方式。然而,当向左移动8时,它改变了结果。奇怪的是,当向左移动24时,情况似乎并非如此。

1 个答案:

答案 0 :(得分:3)

在每种情况下,角色在轮班之前都会升级为int

在您的平台上,char已签名,因此c-1,但(unsigned char)(c)为255。

所以你看到了:

  • -1 << 8
  • 255 << 8
  • -1 << 24
  • 255 << 24

请注意,后者溢出并换行(在您的平台上)。它与255U << 24不同,即4278190080.要实现这一点,您必须说(unsigned int)(unsigned char) c << 24