如果char a = -128;
它以二进制表示为10000000
。字符的奇怪行为
但是当我将这个二进制等价物转移到左边一位时,它给我-256
,因为我的大脑没有任何意义。
任何人都可以向我解释这种奇怪的行为是如何来的吗?
int main(){
char a=-128;
printf("%d",a<<1);
return 0;
}
如果char a = -128;
它以二进制表示为10000000
。字符的奇怪行为
但是当我将这个二进制等价物转移到左边一位时,它给我-256
,因为我的大脑没有任何意义。
任何人都可以向我解释这种奇怪的行为是如何来的吗?
int main(){
char a=-128;
printf("%d",a<<1);
return 0;
}
按照规则#变速操作者的,
整数优惠在每个操作数的执行。 [...]
所以,同时使用a<<1
作为参数为printf()
,a
感char
类型和1
被的int
(文字)的类型,a
值被提升到键入int
,然后,将变速将被执行,那么结果将被打印出作为和int
的值。
[#] - C11
,章§6.5.7,按位移位运算
-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
转移之前。
但我认为OP意味着'char' .....(标题..) –
@SouravGhosh我猜这是错误的标题,因为转移字符的结果将是0而不是-256。 – LPs
在转换之前,'char'被提升为'int'。 –
整数提升。先阅读。几乎所有基于C的语言都使用它,并且在这里有很多关于它的问题 –