C按位移位

时间:2011-09-25 05:01:43

标签: c

我认为sizeof(char)是一个字节。然后当我写下面的代码时,

    #include<stdio.h>

    int main(void)
    {
       char x = 10;

       printf("%d", x<<5);
    }

输出为320

我的问题是,如果char长度为一个字节且值为10,则应为:

0000 1010

当我换班5时,不应该成为:

0100 0001

那么为什么输出320而不是65?

我在Linux上使用gcc并检查sizeof(char) = 1

3 个答案:

答案 0 :(得分:12)

在C中,所有小于int的中间体都会自动提升为int。 因此,您的char被提升为大于8位。

所以你的0000 1010向上移动了5位得到320.(没有任何东西从顶部移开)

如果你想旋转,你需要做两个班次和一个面具:

unsigned char x = 10;

x = (x << 5) | (x >> 3);
x &= 0xff;

printf("%d", x);

使用内联汇编可以更快地完成它,或者如果编译器支持它,内在函数。

答案 1 :(得分:0)

因为你描述的是旋转而不是移位。 0始终在左移时移入。

答案 2 :(得分:0)

Mysticial是对的。如果你这样做

char x = 10;
printf("%c", x);

打印“@”,如果检查ASCII表,则为64。

0000 1010 << 5 = 0001 0100 0000

你有溢出,但由于它被提升为int,它只是打印了数字。