编程语言——有无符号左右移位小见

本篇文章主要是自己对左右移位所学的心得,花了两个多小时,终于弄明白了,不敢私藏,故拿出来和大家分享,希望大家能更清楚地了解计算机语言移位操作。
进入正题前先了解几个概念:

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

 

注意:

  1. 寄存器里的数本身为正的话,输出时系统不是输出补码

    存i的寄存器里各位为0100 0000 0000 0001,右移一位为:0010 0000 0000 0000,即=8192
  2. 赋值的时候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
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值