2011-08-11 95 views
1

谁能解释为什么下面的代码输出它做什么:符号 - 无符号转换

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时,情况似乎不是这样。

回答

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