[英]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.