算数左移、逻辑左移、移位操作 >>和>>>

前言

  在进行移位操作时,对于无符号的左移和右移总是比较容易理解,无符号数的二进制表示也比较容易理解,但在进行有符号数的左移和右移时就可能产生一些问题。

1. 二进制表示

已正负3为例:(为表示方便,高三个字节省略)

  • 原码:
+30000 0011
-31000 0011
  • 反码:负数符号位不变,其余取反
+30000 0011
-31111 1100
  • 补码:正数不变,负数在反码基础上 +1
+30000 0011
-31111 1101

  原码是最容易让人理解的形式,即便学过了微机原理,过了一段时间,我还是不自觉的会认为原码就是计算机所存储的形式,但实际是以补码形式存储。
  之所以出现补码是为了计算机方便处理,再不用判断符号位(让逻辑电路判断符号位比较复杂)的情况下:
原码计算:

3 - 3 = 0000 0011 + 1000 0011 =1000 0011

总是无法得到正确的结果

补码计算:

3 - 3 = 0000 0011 + 1000 0011 =0000 0011[] + 1111 1101[] = 0000 0000[] = 00000000[] 

2. 正数移位

   对于正数来说,左移右移或者 有符号移位(算数移位)和无符号移位(逻辑移位)似乎都比较简单

  • 有符号数移位>>
    0000 1111 >> 2 = 0000 0011
  • 无符号数移位>>>
    0000 1111 >>> 2 = 0000 0011

3. 负数移位

负数存储为补码形式,以15为例:

/* 原码 */
1000 0000 | 0000 0000 | 0000 0000 | 0000 1111
/* 补码 */
1111 1111 | 1111 1111 | 1111 1111 | 1111 0001
  • 有符号数移位>>
    1111 1111 | 1111 1111 | 1111 1111 | 1111 0001 >> 2 = 1111 1111 | 1111 1111 | 1111 1111 | 1111 1100
    转换为原码后为 -4
  • 无符号数移位>>>
    1111 1111 | 1111 1111 | 1111 1111 | 1111 0001 >>> 2 = 00111111 | 11111111 | 11111111 |11111100
    转换为原码后为 1073741820

4. 逻辑移位 和 算数移位

逻辑移位:无符号移位,只补充0
算数移位:有符号移位,根据正负补充0和1

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值