如果char a = -128;
它以二进制形式表示为10000000
。
但是当我将这个二进制等价物向左移一位时,它给了我-256
,而我的大脑对它没有任何意义。
有人可以向我解释这种奇怪的行为是怎么来的吗?
int main(){
char a=-128;
printf("%d",a<<1);
return 0;
}
答案 0 :(得分:4)
根据移位运算符#的规则,
对每个操作数执行整数提升。 [...]
因此,在使用a<<1
作为printf()
的参数时,a
属于char
类型,1
属于int
类型(字面值),a
值被提升为int
类型然后,将执行移位,然后结果将打印为 int
值
[#] - C11
,章节§6.5.7,按位移位运算符
答案 1 :(得分:4)
-128
变量上的 int
为0xffffff80
。
向左移位的结果为0xffffff00
-256
。
您可以使用以下代码进行测试:
int main(void)
{
int n = -128;
printf("Decimal value = %d\n", n);
printf("Hex value = %x\n", n);
n<<=1;
printf("Decimal value = %d\n", n);
printf("Hex Value = %x\n", n);
return 0;
}
修改强>
在您的代码中printf
正在将char
变量提升为int
,然后再将其转移。