2015-07-28 107 views
2

如果char a = -128;它以二进制表示为10000000字符的奇怪行为

但是当我将这个二进制等价物转移到左边一位时,它给我-256,因为我的大脑没有任何意义。

任何人都可以向我解释这种奇怪的行为是如何来的吗?

int main(){ 
char a=-128; 
printf("%d",a<<1); 
return 0; 
} 
+1

整数提升。先阅读。几乎所有基于C的语言都使用它,并且在这里有很多关于它的问题 –

回答

4

按照规则#变速操作者的

整数优惠在每个操作数的执行。 [...]

所以,同时使用a<<1作为参数为printf()achar类型和1被的int(文字)的类型,a值被提升到键入int,然后,将变速将被执行,那么结果将被打印出作为int的值。


[#] - C11,章§6.5.7,按位移位运算

4

-128int变量是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转移之前。

+0

但我认为OP意味着'char' .....(标题..) –

+0

@SouravGhosh我猜这是错误的标题,因为转移字符的结果将是0而不是-256。 – LPs

+3

在转换之前,'char'被提升为'int'。 –