A-A+

汇编的进位与溢出区别总结

2011年10月25日 编程开发 评论 3 条 阅读 4,041 views 次

这学期学习汇编,一个字:难。整理了一下汇编的汇编和进位的区别,感兴趣的朋友看看。

对于无符号数来说,不存在溢出的问题,它的进位就相当于有符号数中的溢出

而对有符号数来说,不存在进位的问题

一个字节(8位) 的数有256个 (2的8次方)
一个字(16位) 的数有65536个 (2的16次方)

8个二进制位能够表达的无符号数范围是:0 ~ 255
16位表达的无符号数范围是:0 ~ 65535
对于无符号数来说,不存在溢出的问题,它的进位就相当于有符号数中的溢出.
进位表示最高位有没有向上形成进位,或向个形成借位,如果有则进位标志CF为进/借位数,但结果没错。
进/借位数要看 十六进制、二进制,进/借的是十六进制、二进制的最高位

处理器内部以补码表示有符号数,
8个二进制位能够表达的有符号数范围是:+127 ~ -128
16位表达的有符号数范围是:+32767 ~ -32768
如果运算结果超出了这个范围,就是产生了溢出,有溢出,说明有符号数的运算结果不正确
溢出是指结束超出数据所表示的范围,通俗地说是装不下了,比如,两个带符号的字节数127和2相加,结果为-1,因为带符号的字节数最大正数为127,所以超过范围,溢出标志位OF为1,说明出错了。
对于有符号数来说,不存在进位的问题

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

溢出标志OF和进位标志CF是两个意义不同的标志.进位标志表示无符号数运算结果是否超出范围,运算结果仍然正确;溢出标志表示有符号数运算结果是否超出范围,运算结果已经不正确。

请看例子
例1:3AH + 7CH=B6H
无符号数运算:58+124=182,范围内,无进位
有符号数运算: 58+124=182 ,范围外,有溢出
例2:AAH + 7CH=(1)26H
无符号数运算:170+124=294,范围外,有进位
有符号数运算:-86+124=28 ,范围内,无溢出

处理器对两个操作数进行运算时,按照无符号数求得结果,并相应设置进位标志CF;同时,根据是否超出有符号数的范围设置溢出标志OF。

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

判断运算结果是否溢出有一个简单的规则:只有当两个相同符号数相加,而运算结果的符号与原数据符号相反时,产生溢出,此时的运算结果显然不正确。其他情况下,则不会产生溢出。

两个正数相加(或一个正数减一个负数)得到负数,或是两个负数相加得到正数,就是溢出了.
一个正数和一个负数相加不可能溢出

Copyright © 风恋尘香 保留所有权利.   Theme  Ality

用户登录