位移运算符学习总结

在C语言中,涉及位移的运算符有2个,>>表示右移,<<则表示左移。
而汇编指令中,SHL和SHR表示逻辑左移和逻辑右移,SAR和SAL表示算术左移和算术右移。
其中,逻辑左移和算术左移都是寄存器二进制位整体向左移动,并在右边补0。
而右移则不同,逻辑右移是整体向右移,并在左边补0,而算术左移则是根据原符号位的值补与其相同的值。

怎么判断何时使用逻辑和算术位移呢?
如果在位移运算符左边的变量是有符号数,如int,char,short等,编译产生的汇编指令是算术位移指令,其中符号位向右移动后,正数的话补0,负数补1。
如果该变量是无符号数,如unsigned int,unsigned char等,编译产生的汇编指令则是逻辑位移指令。

因此,一个程序如果使用了有符号数,是不可移植的。嵌入式的程序通常采用交叉编译开发,如果定义为有符号的,就无法保证右移操作能跨平台使用,这就是为什么用unsigned int,而不用int的主要原因。

右移实例:
int i = 7;
int j = -7;
printf("i=%x,j=%x.",i,j);
i=7,j=fffffff9;

i = i >> 2;
位移前:00000000 00000000 00000000 00000111
位移后:00 00000000 00000000 00000000 000001
j = j >> 2;
位移前:11111111 11111111 11111111 1111 1001
位移后:11 11111111 11111111 11111111 1111 10
printf("i=%x,j=%x.",i,j);
i=1,j=fffffffe;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值