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

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

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

编程时需要注意的: 

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

posted on 2013-10-16 17:46  amanlikethis  阅读(20908)  评论(0编辑  收藏  举报