造轮子:补码分析补充(二)

此文,关于上一篇博文做一个补充,关于补码的大小比较算术溢出的判断方法。
造轮子:补码实现与若干分析

新开的CSDN博客,博文更新还要各种审核,于是不如新开一篇。

大小比较

补码的大小比较基本就是两步走,先比较符号位,同号再进一步比较。

// if a > b then return 1
// if a < b then return ~0
// if a == b then return 0
word compare(word a, word b){
    if(a >> 31 > b >> 31) return ~0; // b >= 0 > a
    if(a >> 31 < b >> 31) return 1; // a >= 0 > b
    if(a < b) return ~0;
    if(a > b) return 1;
    return 0; // a == b
}

太简单了就不详细讲了,需要注意的是 ~0 是 -1 的一种简写(仅补码有效)

运算溢出分析

目前只想到了针对加减法比较好的溢出判断。
先讨论加法,因为减法可以转换为加法。

  • 设两码 a=0,b[0,2n) (a,b 中有至少一个为 0)、
    则有
    a+b=b

    由于 b 本身合法,所以不可能溢出。
  • 设两码 a(0,2n1),b(0,2n1) (a,b所表示的均为正数)
    a+b(0,2n1)

    2n2>2n11,(n>2)

看上去是可能溢出的,而且乍一看似乎没有办法直接处理。
然而,在数学上,非负数a, b应均不超过它们之和 a + b
如果这个条件不成立,则视为运算溢出。

基于上面的情况(a, b均表示正数),下面证明
a+b2n1 ,则 mtoa(a+b)<mtoa(a)mtoa(a+b)<mtoa(b)
证:
不妨设

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值