算数移位理解不难但有点麻烦,我们先从逻辑移位了解
1.逻辑移位
【逻辑左移】(logical shift left)
1000 1001–> 0001 0010------------------左移末尾补零
【逻辑右移】(logical shift right)
1000 1001 --> 1100 0100------------------右移首位补一
2.算数移位
【算数左移】(Arithmetic shift to the left)
有符号数:等同于逻辑左移
无符号数:等同于逻辑左移
【算数右移】(Arithmetic shift to the right)
有符号数:首位补的是符号位(0001–>0000 or 1001–> 1100)
无符号数:等同于逻辑右移
在汇编指令中,shl(可理解为shift left)和shr(shift right)表示逻辑左移和逻辑右移,sal(static left)和sar(static right)表示算术左移和算术右移。
#include <stdio.h>
int main()
{
int a = 65; //有符号整型 0100 0001
unsigned int b = 65; //无符号整型 0100 0001
a <<= 1; //1000 0010 130
b >>= 1; //0010 0000 32
char c = 127; //0111 1111
c <<= 3; //1111 1000 -8
char d = 127; //0111 1111
d >>= 3; //0000 1111 15
char e = -8; //内存以补码为1111 1000存储 源码为1000 1000 反码为1111 0111
e >>= 3; //-1 补码1111 1111 源码 1000 0001 反码1111 1110
printf("%d %d\n",a,b);//130 32
printf("%d %d\n",c,d);//-8 15
printf("%d\n",e); //-1
return 0;
}
有符号的int,short,char进行移位时,左移还是逻辑左移,但右移时生成的汇编指令是算术右移。
原文链接:https://blog.csdn.net/xzg_2017/article/details/80158215