有符号到无符号转换



有人能解释为什么下面的代码输出它的功能吗:

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

相关内容

最新更新