汇编语言.两有符号数运算,如何自己判断是否溢出

汇编语言.两有符号数运算,如何自己判断是否溢出,第1张

计算机中的溢出,是指数据过大,超出了预定的范围。

八位二进制,可以代表自然数:0~255;

也可以代表整数:-128~+127。

判断溢出,常用的方法:

1。你用十进制,人工计算。和,在容许范围之内,就没有溢出。

这种方法最简单。而且,对无符号数、带符号数,都是适用的。

2。你用二进制,人工计算。和的符号,属于合理,就没有溢出。

这种方法稍稍麻烦。只能判断“带符号数”的溢出。

3。你编个程,让 CPU 计算。如果 OF = 0,就没有溢出。

这种方法,难度较大。

4。你把两个数据,显示出来,求大家帮你判断。

在你那边,网络通了吧。

一般在工作中会根据实际情况考虑使用合适的数据类型。比如你要存储一个省的人数,你就不能去选择char型,而应该选择int或者能存储更大数据的类型。
所以通常是通过选择合适数据类型来避免溢出。
如果非得判断数据是否溢出,我给你一个方法。通过将其扩大到一个大的数据类型然后进行数据溢出判断。
eg:
char a = X; //X是随机数据
int b = a Y; //Y是随机数据
if( b < -128 || b > 127) 对于a这种char类型来说则溢出。

在用二进制进行加减计算的时候,要看“最高位的进位”就“次高位的进位”。 这两个进位,如果相同,则无溢出。若不同,则溢出。

拓展:

在几乎所有计算机语言中,不管是新的语言还是旧的语言,使缓冲区溢出的任何尝试通常都会被该语言本身自动检测并阻止(比如通过引发一个异常或根据需要给缓冲区添加更多空间)。

当应用程序读取用户(也可能是恶意攻击者)数据,试图复制到应用程序开辟的内存缓冲区中,却无法保证缓冲区的空间足够时(换言之,假设代码申请了 N 字节大小的内存缓冲区,随后又向其中复制超过 N 字节的数据)。内存缓冲区就可能会溢出。想一想,如果你向 12 盎司的玻璃杯中倒入 16 盎司水,那么多出来的 4 盎司水怎么办?当然会满到玻璃杯外面了!

不同的运算的判断方法是不一样的。例如:有符号数加法,两个 *** 作数符号相同,而结果符号与之相反则溢出;而有符号数减法,两个 *** 作数符号相反,而结果的符号与减数相同则溢出。在编程时,一般是通过检查OF标志位是否为1来判断是否溢出。

什么是溢出?

溢出,是指数据的大小,超出了编码所能表示的范围。

不仅是补码计算,任何形式的计算,都可能产生溢出。

比如:1999 年、2000 年 ,这是用 4 位十进制表示。

当到了 9999 年,再过一年,你如果还用 4 位表示,就会溢出了。

 

如果不限制编码的位数,那就不存在溢出的问题。

-----------------------------

无符号数的溢出

计算机所能运算的位数是固定的,如:八位机、16、32、64 位机。

当字长为八位时,其计数范围是:0000 0000~1111 1111。

用它们表示十进制的自然数,就是:0~255。

在小学学过的自然数,在计算机专业中,改称为“无符号数”。

---------------

如果在其最大值(255)再加上一,就会超出表示范围,发生溢出。

此时,八个位就都为 0,进位将为 1。

进位为 1,就是无符号数溢出的标志。

 

进位 1,代表十进制的 256。

256 也就是八位二进制的计数周期,计算机专业改称为“模”。

-----------------------------

带符号数的溢出

八位二进制也能表示整数,包括了正整数、零和负整数。

在小学学过的整数,在计算机专业中,改称为“带符号数”。

 

此时,0 ~ 127,就直接代表零和正整数;

 128~255,是以补码代表负整数 (-128~-1)。

---------------

正数最大值(+127)上再加+1,就会超出表示范围,发生溢出。

此时得到的是 128,这是负数(-128)的补码。

注意,此时的进位为 0,结果的符号错误,才是溢出的特征。

---------------

在负数最小值(-128)再加-1,也会超出范围,发生溢出。

 

计算如下:

 1000 0000

 + 1111 1111

---------

 (1)   0111 1111

 

此时,得到的是正数(+127)!

 

注意,此时的进位为 1,并无意义。

 结果的符号错误,才是溢出的特征。

---------------

“带符号数”溢出的特征是:运算结果的符号,与正常结果相反。

“带符号数”的溢出,与进位是 1 是 0,并无关系。

---------------

判断是否溢出的方法

因为“带符号数”运算发生溢出,必定是结果超出范围。

所以,只有如下四种运算,才有可能出现溢出:

 正数+正数、负数+负数、正数-负数、负数-正数。

其它运算如:正-正、,就不必考虑溢出了。

 

由人工计算:就可根据数据的符号来判断,如:

正+正,出现负的结果;

负+负,出现正的结果;

 

发生上述四种之一,就是溢出。

 

也可考查进位与次高位的进位,两者不同,就是溢出。

 

用 CPU 计算:它能自动判断,如果发生溢出则会置位 OF。

-----------------------------

要通过计算机运算,就先的申请计算机内存,存储数据,申请的时候数据有数据类型,数字的话用int类型举例把,int在不同的语言中他占用的内存是不同的,就以c语言为例,是占用8个字节,在计算机中是以2进制表示(00000000 00000000)共8位(最高位是0代表正数,1则是负数);2个数相加就是2个16位的2进制相加,比如01000000 00000000(16384)+01000000 00000000(16384)=10000000 00000000 ;这就溢出了,因为最高位是符号位,1代表负数;大概是这样把,不知道有错的没,呵呵

呵呵 还是俺来帮你解答吧
1 汇编语言。两有符号数运算,如何自己判断是否溢出?其实有个简单的方法可以使用,即使用逻辑判断法:
即 从逻辑上看是否正确。
具体如下: 当 正数+正数=负数 则逻辑上看出 是错误的 即溢出
负数+负数=正数 则逻辑上看出 是错误的 即溢出
当 正数+负数 是互相抵消的 不会产生溢出

当 正数—负数=负数 则逻辑上看出(结果应为正) 是错误的 即溢出
负数—正数=正数 则逻辑上看出(结果应为负) 是错误的 即溢出
当 正数-正数 或 负数-负数 二者是互相抵消的 不会产生溢出
嘿嘿 这种方法虽很简单 但也很使用。
2 当of=1,sf=1,为什么实际运算结果为正?给予回答如下:
说明有逻辑错误了 运算时的符号标志位sf=1 为负 实际运算结果为正 从逻辑上已经是说不通了 (因此可以判断运算出错 即溢出) 与实际的溢出标志位 of=1 相吻合。
二者不矛盾。

呵呵 如果俺给你解释清楚了 就给俺加分吧 (以示鼓励)


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/13381493.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-07-25
下一篇 2023-07-25

发表评论

登录后才能评论

评论列表(0条)

保存