首页 > 技术文章 > 计算机基础--整数加减运算

gaoliwei1102 2020-04-24 15:50 原文

整数的加减运算

在计算机我们的编程过程中,经常会出现以下的问题, 明明自己的代码逻辑没有错, 但结果却是错的,其中的一个原因就是数据溢出。
接下来我们简单介绍一下整数在计算机中的计算方式。

重要知识点:

1.无符号整数和带符号整数的加减运算电路是完全一样的。
2.无论是补码减法还是无符号数减法,都是被减数加上负数的补码实现的。


下图为n位整数加减运算器:

无符号整数加减和带符号整数加减均可在此加法器中实现。

图中 X,Y 为两个待操作数的输入。若对于无符号运算来说, X, Y即为两个数的无符号数表示; 对于带符号数来说, X, Y是输入数的补码表示。
其中, ZF为零标志, 结果为0时 ZF=1,否则 ZF=0
OF为溢出标志, 结果溢出时 OF=1,否则 OF=0
SF为结果数(带符号数)的符号位, 正数时 SF=0,负数时 SF=1
CF为结果数(无符号数)加减运算的进/借位。

对于无符号来说,无论怎样运算,其result结果均为正数,但溢出可能会发生结果出错的情况。
因此,无符号数加法运算公式如下:

if(x+y < 2的n次方){
    result = x+y;                              //正确结果
}else if(2的n次方 <= x+y <= 2的n+1次方){        //此时说明计算结果超出变量的存储范围, 发生溢出
    result = x+y-2的次方;                      //此时结果为溢出后的结果, 并不正确
}

同理, 无符号数减法运算公式如下:

if(x-y > 0){
    result = x-y;                              //正确结果
}else if(x-y < 0){                            //无符号数无负数, 发生溢出
    result = x-y+2的n次方;                      //此时结果为溢出后的结果, 并不正确
}

带符号数的加减法运算同样也会在此运算电路中执行。

若此两个数的符号相反,说明操作结果一定在变量的存储范围中,则一定不会发生溢出。
若此两数的符号相同,说明操作结果可能会超出变量的存储范围,则可能发生溢出。
两个正数相加时发生的溢出为正溢出, 两个负数相加时发生的溢出为负溢出。

可得,带符号整数加法运算公式如下:

if(x+y >= 2的n-1次方){
    result = x+y-2的n次方;                    //带符号数发生正溢出,因此计算结果为正确结果减去模的值
}else if(-2的n-1次方 <= x+y < 2的n-1次方){    //计算结果未超出范围, 正确结果
    result = x+y;
}else{                                       //此时 x+y < -2的n-1次方, 出现负溢出
    result = x+y+2的n次方;                   //因此计算机中计算的结果为 x+y+2的n次方
}

同理,带符号整数减法运算公式如下:

if(x-y >= 2的n-1次方){
    result = x-y-2的n次方;                    //带符号数发生正溢出,因此计算结果为正确结果减去模的值
}else if(-2的n-1次方 <= x-y < 2的n-1次方){    //计算结果未超出范围, 正确结果
    result = x-y;
}else{                                       //此时 x-y < -2的n-1次方, 出现负溢出
    result = x-y+2的n次方;                   //因此计算机中计算的结果为 x-y+2的n次方
}

以上就是无符号、带符号加减法的操作及相应的结果,其中n为存储数据的位数。
感谢观看!

小知识: Java语言不支持无符号整数类型哦!

推荐阅读