有人能解释为什么下面的代码输出它的功能吗:
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
我认为转换为无符号字符只会改变比特的解释方式。然而,当向左移动8时,它改变了结果。奇怪的是,当向左移动24时,情况似乎并非如此。
在每种情况下,字符都会在移位前升级为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
。