zoukankan      html  css  js  c++  java
  • 进位位(carry)与溢出位(overflow)的区别

        处理器内部以补码表示有符号数,8个二进制位能够表达的整数范围是:+127 ~ -128,16位表达的范围是:+32767 ~ -32768.如果运算结果超出了这个范围,就是产生了溢出;有溢出,说明有符号数的运算结果不正确.

    例如:3AH + 7CHB6H,就是58 + 124182,已经超出-128 ~ 127范围,产生溢出,所以OF = 1。从另一方面看,补码B6H表达值是-74,显然运算结果也不正确。

         溢出标志OF和进位标志CF是两个意义不同的标志

       进位标志表示无符号数运算结果是否超出范围,运算结果仍然正确; 

       溢出标志表示有符号数运算结果是否超出范围,运算结果已经不正确。

    请看例子

    13AH + 7CHB6H

    无符号数运算:58124182,范围内,无进位

    有符号数运算: 58124182 ,范围外,有溢出

    2AAH + 7CH=(126H

    无符号数运算:170124294,范围外,有进位

    有符号数运算:-8612438 ,范围内,无溢出

    处理器运算器对有符号数的运算过程(猜想):

        处理器对两个操作数进行运算时,首先需要转换成补码(有符号数在计算机中都是以补码形式存储的),这两个补码按照无符号数求得结果(符号位也参与运算),如果有进位的话,舍去(即按无符号数运算产生的进位不考虑,这个进位对于有符号数运算是没有意义的);同时,根据是否超出有符号数的范围设置溢出标志OF

    怎样判断有符号数运算是否产生溢出:

        只有当两个相同符号数相加,而运算结果的符号与原数据符号相反时,产生溢出;其他情况,不会产生溢出。

    编程时需要注意的: 

        应该利用哪个标志,则由程序员来决定。如果将参加运算的操作数认为是无符号数,就应该关心进位;认为是有符号数,则要注意是否溢出。

  • 相关阅读:
    基于单片机定时器---年月日时分秒的算法
    按位查询算法---基于Perimiter Sensor
    MFC File crc 计算
    二叉树的层次遍历

    动态规划
    贪心算法 动态规划
    爱信息图床测试
    前端小白的个人习惯和笔记(一)
    过年了,是不是应该写点代码祝福别人
  • 原文地址:https://www.cnblogs.com/amanlikethis/p/3372681.html
Copyright © 2011-2022 走看看