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)
当我第一次看到这个问题时,我的初步观点是char'c'应该向左移8位 - 所有8位被丢弃,然后空char将被转换为值为0的int.
一些研究揭示了通常的一元转换 - 这是减少大量算术类型的地方,转换自动应用于一元'!',' - ','〜'和'*'运算符的操作数,并且每个二进制"<<"和">>"运算符的操作数.
因此,char'c' 首先转换为int ,然后向左移动,给出你看到的答案.
你每天学习新的东西!