我认为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
答案 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,它只是打印了数字。