• 计算机基础--整数加减运算


    整数的加减运算

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

    重要知识点:

    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语言不支持无符号整数类型哦!

  • 相关阅读:
    织梦dedecms模板中调用wordpress文章
    dede标签云(TAG)随机颜色及大小的实现方法
    将dedecms数据转换到wordpress博客程序中的方法分享
    织梦dedecms模板中友情链接标签底层模板样式调整
    织梦dede增加自定义属性四步实现
    dedecms专题分节点自由单独调用的实现方法
    DedeCMS 批量取消审核文档的实现方法
    织梦dedecms 5.1 utf-8版本英文修改方法
    织梦dedecms后台自定义字段里添加style全部都变成st<x>yle的解决教程
    Android 获取第三方软件的包名、入口Activity的类名
  • 原文地址:https://www.cnblogs.com/gaoliwei1102/p/12767935.html
Copyright © 2020-2023  润新知