在C左移(char)0xFF由8并将其转换为int

Geo*_*eos 12 c signed char shift

在(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;
}
Run Code Online (Sandbox Code Playgroud)

输出是

-256 ffffff00
Run Code Online (Sandbox Code Playgroud)

sha*_*oth 16

char可以是签名或未签名 - 它是实现定义的.您会看到这些结果,因为char您的编译器默认签名.

对于签名的字符0xFF对应于-1(这是两个补码的工作方式).当你试图移动它时,它首先被提升为a int然后移动 - 你有效地得到乘以256.

所以这是代码:

char c = 0xFF; // -1
int shifted = c << 8; //-256 (-1 * 256)
printf( "%d, %x", shifted, shifted );
Run Code Online (Sandbox Code Playgroud)


Bea*_*ano 9

当我第一次看到这个问题时,我的初步观点是char'c'应该向左移8位 - 所有8位被丢弃,然后空char将被转换为值为0的int.

一些研究揭示了通常的一元转换 - 这是减少大量算术类型的地方,转换自动应用于一元'!',' - ','〜'和'*'运算符的操作数,并且每个二进制"<<"和">>"运算符的操作数.

因此,char'c' 首先转换为int ,然后向左移动,给出你看到的答案.

你每天学习新的东西!