计算机中二进制加减法时,是如何判断溢出的?
溢出是在有符号运算中出现的,异号运算 OF=0,同号运算 OF=1。
溢出,在用二进制进行加减计算的时候,要看“最高位的进位”就“次高位的进位”。
这两个进位,如果相同,则无溢出。
设两个8位补码表示的数b7b6b5b4b3b2b1b0和a7a6a5a4a3a2a1a0相加,
把b7 + a7的进位称为C7,把b6 + a6的进位称为C6,
那么,C7、C6,如果不同,就是溢出了。
楼主给出的题目如下,依据这些,是不能判断溢出的,因为其中并没有“次高位的进位”。
溢出(b7,a7为符号标记),则____
A.b7与a7的逻辑或结果一定是1
B.b7与a7的逻辑与结果一定是为0
C.b7与a7的逻辑异或结果一定为1
D.b7与a7的逻辑异或结果一定0;答案为D
扩展资料:
在几乎所有计算机语言中,不管是新的语言还是旧的语言,使缓冲区溢出的任何尝试通常都会被该语言本身自动检测并阻止(比如通过引发一个异常或根据需要给缓冲区添加更多空间)。但是有两种语言不是这样:C 和 C++ 语言。C 和 C++ 语言通常只是让额外的数据乱写到其余内存的任何位置,而这种情况可能被利用从而导致恐怖的结果。
更糟糕的是,用 C 和 C++ 编写正确的代码来始终如一地处理缓冲区溢出则更为困难;很容易就会意外地导致缓冲区溢出。除了 C 和 C++ 使用得 非常广泛外,上述这些可能都是不相关的事实;例如,Red Hat Linux 7.1 中 86% 的代码行都是用 C 或 C ++ 编写的。因此,大量的代码对这个问题都是脆弱的,因为实现语言无法保护代码避免这个问题。
参考资料来源:百度百科-溢出
当加法或减法的结果发生进位,必须考量到当运算的数值与结果都是unsigned numbers(无号数值,即“正数”)类型时,运算的结果就不适合使用这个数值类型。所以,在运行无号数值(正数)的加法或减法之后检查进位旗标是非常有用的作法。
“溢出”在运算结果为无号数值时容易发生,可以从有符号的运算数值预计出这类的情形(例如:两个正整数相加产生的结果为一个负数)。所以,在运行2的补数的加法或减法之后检查溢出旗标是非常有用的作法(换言之,有考虑到有号数值)。
定义A和B都是长度为n位的二进制数
以下是竖式(第一行为进位):
其中
是
的进位
1、输入的数是无符号整数,我们通过观察C判断是否溢出
a) C=1
i)如果是加法操作,结果不正确,结果溢出
ii)如果是减法操作,结果正确,结果未溢出
b) C=0
i)如果是加法操作,结果正确,结果未溢出
ii)如果是减法操作,结果不正确,结果未溢出。在这种情况下,结果是负数。然而,在无符号整数世界里,负数不存在,我们认识这样的操作是非法的。当然,如果认为答案是以有符号整数补码的形式出现,则结果正确。
2、输入的数是有符号整数,我们通过观察V判断是否溢出
a) V=1,结果不正确,结果溢出
b) V=0,结果正确,结果未溢出
扩展资料:
计算机的二进制数据是用0和1两个数码来表示的数。它的基数为2,进位规则是“逢二进一”,借位规则是“借一当二”。由德国数理哲学大师莱布尼茨于1679年发明。
当前的计算机系统使用的基本上是二进制系统,数据在计算机中主要是以补码的形式存储的。计算机中的二进制则是一个非常微小的开关,用“开”来表示1,“关”来表示0。
参考资料来源: 百度百科-算术溢出
容器太小,就会溢出。
计算机中,是用机器码,代表两种常用的数字,其范围如下:
机器码,无论代表什么数字,只要运算结果超出范围,就是【溢出】。
但是,在计算机专业人的嘴里,就不一样了。
【无符号数的溢出】,不叫溢出,要叫做【进位】。
【带符号数的溢出】,才叫做【溢出】。
搞计算机的这些人,基本概念不清,却自命不凡!
冒充脑回路清奇。。。正常人对此,就只能无语了。
---------------------------
按照计算机专业的说法:
溢出,是指“补码运算结果超出范围”。
溢出的特征,是“符号错误”。
知道了这些,判断是否溢出,就很容易了。
一、无符号数的运算,肯定不会溢出。只有进位。
二、只有:正+正、负+负,才可能溢出。不是这些,就绝不会溢出。
三、人工用数值计算。和,如果不超出范围,就不会溢出。
四、人工用补码计算。和的符号,如果正确,就没有溢出。
五、编个程序,让计算机计算。然后观察溢出标志位,为零,就没有溢出。
六、人工用补码计算,如“最高位的进位”和“次高位的进位”相同,就没有溢出。
第六种,本是 CPU 的硬件所用的方法。
其理论基础,也是很晦涩难懂的。
异或运算,一般也不需要初学者掌握。
但是,一些爱得瑟的老师,偏爱介绍这种方法。
其实,这是很无聊的表现,总想难为难为学生。
2016-01-18 · 知道合伙人教育行家
同号运算 OF=1首先符号相反是不会产生溢出的~~所以就是X0Y0或~X0~Y0X0Y0~S0:负+负仍为负,故S0若0(即为正)则溢出;~X0~Y0S0:正+正仍为正,故S0为1(即为负)则溢出;至于减法似乎不对比如1-(-1)就为00000001-11111111=00000010,结果是对的,没有溢出,所以减法应该是不对的;正确的方法还是应该判断最符号位进位和最高位进位,异或为1则溢出,为0不溢出,加减法都适用。
如像C的整形:就为32768,超出就是啦!!
回帖,是对朋友的帮助 请大家帮忙
评分,是对帮助的肯定 按感觉给分