在C向左偏移(炭)通过为0xFF 8和投它为int
题
在的(char)的左移位0xff的由8和铸造它为int我们得到-256或0xffffff00。 有人可以解释为什么发生这种情况?
#include <stdio.h>
int main (void)
{
char c = 0xff;
printf("%d %x\n", (int)(c<<8),(int)(c<<8));
return 0;
}
输出是
-256 ffffff00
解决方案
char
可符号或无符号 - 它的实现定义的。你看到这些结果,因为char
默认情况下,你的编译器签名。
有关符号的字符0xFF的对应于-1(这是怎么补的工作)。当您尝试移动它,它首先被提升到int
,然后转向 - 你有效地得到256乘以
因此,它是这样的代码:
char c = 0xFF; // -1
int shifted = c << 8; //-256 (-1 * 256)
printf( "%d, %x", shifted, shifted );
其他提示
当我第一次看到这个问题,我最初的看法是,炭“c”应被左侧8个比特移位 - 被丢弃所有8位,空字符将被转换为的值0的int
研究的位显示的通常的一元换算 - 这是减少大量算术类型的,转换被自动应用到的一元操作数,“!”“ - ”,“〜 '和 '*' 的运营商,和以每个操作数的二进制 '<<' 和 '>>' 运算符。
因此炭 'C' 被转换为int的第一,然后左移,给你看便知。
您每天学习新的东西!
完成变速操作前的C是被提升到一个int。假设你的实施,使得在默认情况下签署的字符,这意味着你会得到为0xffffffff,然后左移给你的结果。
如果你使C为无符号的字符,你应该得到你所期望的。
字符也不过是符号的字符。因此,焦炭C = 0xFF的将是-1。当左移位-1由8位你得到-256。
不隶属于 StackOverflow