一.溢出概念中公式的理解

首先看下“溢出”的概念:

很多人不理解  | x | < ( 2^{n} - 1 )  这个公式的意思,

先看这个图,公式所包含的范围就是图中定点整数所表示的范围:

下面举个例子:

                设一个特殊二进制数:a=0 1 1 1 1 1 1 1 (其中0表示符号位 ,"0"表示正数"1"表示负数)

                a每个位置上的数对应的十进制数 ,如下所示:

2^{8} 2^{7} 2^{6} 2^{5} 2^{4} 2^{3} 2^{2} 2^{1} 2^{0}
0 1 1 1 1 1 1 1 1
256 128 64 32 16 8 4 2 1

               为什么说它特殊呢,因为 a是在 8 位(有符号位)的情况下,值最大的二进制数

                此时,n=8 刚好有:

                a=2^{n}-1=2^{8}-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 ]补= 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”,所以“正 溢 出”。

                         

                        

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐