以补码 0x 来演示左移、逻辑右移与算术右移。
注意, 对于无符号整数,右移必须是逻辑右移。而对于有符号整数,C 语言标准并没有明确定义应该使用哪种类型的右移,但几乎所有的编译器均采用算术右移。
参考如下示例:
// //@file: main.c // #include <stdio.h> #include <stdint.h> int main() { int a = -1; printf("a=0x%x\n", a); //a=0xffffffff printf("a<<1=0x%x\n", a<<1); //左移,结果为 0xfffffffe printf("a>>2=0x%x\n", a>>2); //算术右移,结果为 0xffffffff unsigned int b=1; printf("b=0x%08x\n", b); //b=0x00000001 printf("b<<1=0x%08x\n", b<<1); //左移,结果为 0x00000002 printf("b>>1=0x%08x\n", b>>1); //逻辑右移,结果为 0x00000000 }
编译输出结果:
gcc main.c ./a.out a=0xffffffff a<<1=0xfffffffe a>>2=0xffffffff b=0x00000001 b<<1=0x00000002 b>>1=0x00000000
参考文献
[1] 龚奕利,贺莲译.深入理解计算机系统[M].北京:机械工业出版社,2016-11.C2.1.9 C语言中的移位运算.P40-41
发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/232143.html原文链接:https://javaforall.net
