任何人都可以解释为什么以下代码输出它的作用:
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时,情况似乎并非如此。
答案 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
。