作业帮 > 数学 > 作业

汇编语言 刚刚学溢出 有个地方不懂 书上说 两个正数相加结果是负数一定溢出 溢出是带符号的 那

来源:学生作业帮 编辑:作业帮 分类:数学作业 时间:2024/05/24 11:37:46
汇编语言 刚刚学溢出 有个地方不懂 书上说 两个正数相加结果是负数一定溢出 溢出是带符号的 那
汇编语言 刚刚学溢出 有个地方不懂 书上说 两个正数相加结果是负数一定溢出
溢出是带符号的
那al是255就分成+127和-128
mov al,+127
add al,2
这肯定溢出了 按照上面说的话 两个正数相加溢出结果是负数 那上面两行代码结果是什么负数啊?我用OD查看的是 81h 也就是129!不是负数啊!
你对计算机中的数,理解有点混乱.
在计算机中存放的由若干位二进制数组成的一组0和1的组合,我们称它为“机器数”.
它是它所代表的某个数值的一种编码表示.这个被代表的数值,我们称为“真值”.
仅仅只看机器数,我们是不能确定它代表的是什么的.
必须还要知道它的编码方式是什么,才能确定真值是什么.
下面举个例子.
一个8位的机器数,用二进制表示是 0100 0010
在不同的编码中,它所表示的真值是不一样的:
如果它的编码是ASCII码,它的真值就是大写字母 ‘B’
如果它的编码是无符号数,它的真值等于十进制数 66
如果它的编码是补码数,它的真值等于十进制数 +66
如果它的编码是压缩的BCD码,它的真值就是十进制数 42
回到你的问题.
当你用+127再加上2的时候,运算过程是:0111 1111 + 0000 0010 = 1000 0001.
如果用无符号数来解释这次运算,3个数都是无符号数,那么运算过程就是 127 + 2 =129
如果用补码数来解释这次运算,3个数都是补码数,那么运算过程变成了 127 +2 =-127
显然,补码运算的结果是不正确的,因为结果超出了8位补码的表示能力.正确的结果+129比8位补码能表示的最大正数+127还要大,超出范围,已经不能正确地表示.所以,溢出标志 OF 被置1.
你的困惑,在于你概念乱用.
你既然假设了数是有正有负的补码,那么对结果 1000 0001的解释也就必须要用补码来理解.它是-127.
你没有理由突然换成无符号数来解释这个结果,将它说成是129.
(这里,有点像你用英语写了good ,却说这是错的,因为拼音没这么拼的)
你说“255就分成+127和-128”,这里也是混乱的.
255是用无符号数来解释 1111 1111这个机器数,后面的+127和-128又突然无理地改成了补码解释8位二进制数.
在补码表示时,1111 1111 不是255,是-1