• 进位位(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

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

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

    编程时需要注意的: 

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

  • 相关阅读:
    合并二叉树
    剑指 Offer 68
    剑指 Offer 42. 连续子数组的最大和
    C语言 递归实现迷宫寻路问题
    C语言数据结构 统计英文文字每个“单词”出现次数
    C语言 双链表的频度排序管理
    C语言 插入排序使链表递增
    c语言 简单的天数计算器
    数据结构 链表的头插法逆置
    C语言 删除指定的单词
  • 原文地址:https://www.cnblogs.com/amanlikethis/p/3372681.html
Copyright © 2020-2023  润新知