在的(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。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top