彻底弄清补码加减法运算,正数、负数位移运算原理

前言

  • 所有的运算都是补码运算。
  • 正数的补码是其本身

负数补码的计算方式:

由原码到补码:原码除符号位以外全部取反得到反码,再加1得到补码。(取反区别于~按位取反运算符,按位取反运算符是包括符号位在内全部取反)
由补码到原码:亦为除符号位以外取反加1,需注意,若补码为正,此时原码和其本身相等,无需取反加1,若不理解,请阅读下文加法例子。

例如(为方便清晰本文以 8bit 类型为例):
-3原码:1000 0011
-3反码:1111 1100
-3补码:1111 1101

两个不同情况的加法例子:

例1:-3 + 2
2 的补码为其本身: 0000 0010
-3 的补码为:           1111 1101
两者相加所得补码 :1111 1111
此时补码为负,除符号位取反加1得到原码:1000 0001,即 -1

例2: -3 + 5
5 的补码:          0000 0101
-3 的补码:         1111 1101
相加所得补码:1 0000 0010
左边 1 溢出范围,舍去:0000 0010
此时补码为正,原码和补码相等,原码亦为:0000 0010,即 2

减法

为了方便与效率,计算机统一做加法,不会做减法,减去一个数即为加上这个数的负数。

例如:5 - 6,会被处理为 5 + (-6),按照以上加法规则运算。

正数位移运算

正数位移较为简单,满足以下规则:

  • 高位补 0
  • 低位补 0

例如
5 >> 1:0000 0101 -> 0000 0010 (2)
5 << 1:0000 0101 -> 0000 1010 (10)
(加粗的 0 是补上的,下面的例子也一样)

整体表现为:
右移 x 位代表除以 2x,向下取整
左移 x 位代表乘以 2x

负数位移运算

负数位移稍为特殊,满足以下规则:

  • 高位补 1
  • 低位补 0
  • 符号位不动

右移例子:
-15 >> 2:
-15 的原码:1 000 1111
补码:          1 111 0001
右移一次:   1 111 1000(此时为 -8 的补码)
右移第二次:1 111 1100
求得原码:    1 000 0100,即为 -4

左移例子:
-15 << 1:
-15 补码: 1 111 0001
左移:       1 110 0010
求得原码:1 001 1110,即为 -30

整体表现为:
右移 x 位代表除以 2x,向下取整
左移 x 位代表乘以 2x

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值