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

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

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

    编程时需要注意的: 

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

  • 相关阅读:
    UML学习——用例图(二)
    servlet相关生命周期(二)
    UML 学习——UML概述(一)
    servlet概述(一)
    java 核心编程——线程之线程控制(五)
    java 核心编程——线程之线程池(ExecutorService)(四)
    java 核心编程——线程之线程组(四)
    java 核心编程——线程之定时器(TimerTask)(三)
    java 核心编程——线程之线程的开发方法(二)
    java 核心编程——线程之线程的基本概念(一)
  • 原文地址:https://www.cnblogs.com/amanlikethis/p/3372681.html
Copyright © 2011-2022 走看看