计算机组成原理(溢出的理解与判断)
x=11011,y= - 10101,求x+y.我们用“0”表示正数,“1”表示负数。双符号位则分别用“00”,“11”表示。双符号位法不用去考虑超过符号位的数(上图中标红的“[ x ] 补 + [ y ] 补 =[ x ] 补 + [ y ] 补 =x =11011,y=10011,求x+y.所以结果为 正数,无溢出。设一个二进制数:x=1 1 1 1 1。
一.溢出概念中公式的理解
首先看下“溢出”的概念:

很多人不理解 | x | < ( - 1 ) 这个公式的意思,
先看这个图,公式所包含的范围就是图中定点整数所表示的范围:

下面举个例子:
设一个特殊二进制数:a=0 1 1 1 1 1 1 1 (其中0表示符号位 ,"0"表示正数"1"表示负数)
a每个位置上的数对应的十进制数 ,如下所示:
| 0 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 |
| 256 | 128 | 64 | 32 | 16 | 8 | 4 | 2 | 1 |
为什么说它特殊呢,因为 a是在 8 位(有符号位)的情况下,值最大的二进制数
此时,n=8 刚好有:
a=-1=
-1 达到了正溢的极限。
现在进行运算,设b=0 0 0 0 0 0 0 1
因为计算机中二进制会转为补码进行运算,我们也进行转换
[ a ]补=0 1 1 1 1 1 1 1 [ b ]补=0 0 0 0 0 0 0 1
a + b = [ a ]补+ [ b ]补= 1 0 0 0 0 0 0 0
可见两个正数相加却变成了 - 0(原码中有正负零),发生溢出(大到超出范围的溢出叫正溢)
同理a = 1 1 1 1 1 1 1 1 和 b = 1 0 0 0 0 0 0 1相加则会产生负溢。
二.用双符号位法判断是否溢出(适用于初学者简单的判断技巧,实际上计算机中并不以此判断是否发生溢出)
接下来我们用双符号位法,即“变形补码”,判断运算结果是否溢出:
(1)
x=11011, y= - 10101, 求x+y.
我们用“0”表示正数,“1”表示负数。双符号位则分别用“00”,“11”表示。
所以x,y的补码(不会算补码的可以网上学习一下)如下图所示:
| [ x ] 补 | 0 0 1 1 0 1 1 |
| 符号位 | |
| [ y ] 补 | 1 1 0 1 0 1 1 |
|
符号位 |
[ x ] 补 + [ y ] 补 的值如下图所示:
|
0 0 1 1 0 1 1 + 1 1 0 1 0 1 1 |
| 1 0 0 0 0 1 1 0 |
双符号位法不用去考虑超过符号位的数(上图中标红的“1”),仅仅需要看两个符号位(标蓝的“0 0 ”,“1 1”,“0 0 ”)。
“0 0 ”表示结果为正,无溢出。
“1 1”表示结果为负,无溢出。
“0 1”表示正溢。
“1 0”表示负溢。
[ x ] 补 + [ y ] 补 = 0 0 0 0 1 1 0
所以结果为 正数,无溢出。
则:x + y = 0 0 1 1 0
下面做一道题练习和验证一下(先不要看答案自己做下试试):
( 2 )
x =11011, y=10011, 求x+y.
[ x ] 补= 0 0 1 1 0 1 1
[ y ] 补= 0 0 1 0 0 1 1
计算 [ x ] 补 + [ y ] 补:
|
0 0 1 1 0 1 1 + 0 0 1 0 0 1 1 |
| 0 1 0 1 1 1 0 |
[ x ] 补 + [ y ] 补 = 0 1 0 1 1 1 0
因为两符号位为“0 1”,所以“正 溢 出”。
魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。
更多推荐



所有评论(0)