char的奇怪行为

时间:2015-07-28 07:21:14

标签: c char bit-manipulation bitwise-operators

如果char a = -128;它以二进制形式表示为10000000

但是当我将这个二进制等价物向左移一位时,它给了我-256,而我的大脑对它没有任何意义。

有人可以向我解释这种奇怪的行为是怎么来的吗?

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

2 个答案:

答案 0 :(得分:4)

根据移位运算符的规则,

  

对每个操作数执行整数提升。 [...]

因此,在使用a<<1作为printf()的参数时,a属于char类型,1属于int类型(字面值),a值被提升为int类型然后,将执行移位,然后结果将打印为 int

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

答案 1 :(得分:4)

-128变量上的

int0xffffff80

向左移位的结果为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,然后再将其转移。