繁体   English   中英

C按位移位

[英]C bitwise shift

我认为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

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

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

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

unsigned char x = 10;

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

printf("%d", x);

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

神秘是对的。 如果你这样做

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

它打印“@”,如果你检查你的ASCII表,它是64。

0000 1010 << 5 = 0001 0100 0000

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

因为你描述的是旋转,而不是转变。 在左移时总是移入0

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM