本篇文章主要是自己对左右移位所学的心得,花了两个多小时,终于弄明白了,不敢私藏,故拿出来和大家分享,希望大家能更清楚地了解计算机语言移位操作。
进入正题前先了解几个概念:
1. 正负数符号位(最高位),正数为0,负数为1
2. 补码:正数的补码为其本身,负数的补码是其绝对值的原码最高位符号位不变,其它位取反,再加1,例如:8位的-1,其原码为1000 0001,其补码为1111 1110+1=1111 1111
3.
无符号左移:每左移一位,高位移出,在低位补一个0
无符号右移:每右移一位,低位移出,在高位补一个0
有符号左移:每左移一位,高位移出,在低位补一个0
有符号右移:每右移一位,低位移出,如果是正数,即高位符号位为0,则移位时在高位补0,如果为负数,即高位符号位为1,则移位时在高位补1.
因为“i=0X4001”这条语句是直接把寄存器的16个位直接写成:0100 0000 0000 0001 ,所以输出为+1=16385
左移1位为1000 0000 0000 0010,注意所有的移位都是直接对寄存器操作的,此时最高位为1,所以系统将其当作负数,输出其值时,系统会自动输出寄存器中的数的补码形式,即1111 1111 1111 1110,所以输出为 -2=-32766,最高位是符号位,别算进去了。(简易算法:上二进制数加2可以得1100 0000 0000 0000,即=32768)
右移还是直接对寄存器操作,所以右移1位为1100 0000 0000 0001,同样还是负数,输出时系统会自动输出寄存器中的补码形式,即1011 1111 1111 1111,即=-16383
注意:
- 寄存器里的数本身为正的话,输出时系统不是输出补码
存i的寄存器里各位为0100 0000 0000 0001,右移一位为:0010 0000 0000 0000,即=8192 - 赋值的时候i=-1与i=0X1001不一样
“i=-1”,意思是i的值为-1,存到寄存器里的格式为其补码形式,即1000 0000 0000 0001的补码,即1111 1111 1111 1111,此时右移是对寄存器直接操作,右移后为:1111 1111 1111 1111,不变,因为是负数,所以输出时系统直接输出寄存器中的补码形式,即1000 0000 0000 0001,即为-1
“i=0X8001”,意思是存储i的寄存器的各位为:1000 0000 0000 0001,此时,i的值其实为:-32767。此时,右移一位,即为:1100 0000 0000 0000,因为其为负数,所以输出时系统自动输出寄存器中的补码形式,即1011 1111 1111 1111+1=1100 0000 0000 0000,即=-16384