当前位置 博文首页 > weixin_33884611的博客:进位位(carry)与溢出位(overflow)的区

    weixin_33884611的博客:进位位(carry)与溢出位(overflow)的区

    作者:[db:作者] 时间:2021-09-06 16:10

    ??? 处理器内部以补码表示有符号数,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

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

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

    编程时需要注意的:?

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

    cs