1. 程式人生 > >資料的範圍 碎碎念

資料的範圍 碎碎念

實際上該篇文章的定位還是蠻高的,就像計算機網路中的特殊地址一樣,是不是幾乎每年必考?在計算機組成這門課裡,資料的範圍通常會以小題的形式考察,但不排除例外,2017年408真題簡直重新整理了我的三觀,原來資料如此有趣!這是2019年,表示考408的我有點惶恐。。

首先,我覺得有必要說明幾個概念:

(1)真值:帶“+”  “-”符號的數稱為真值,真值是機器數所代表的實際值

(2)機器數:把“符號位” 數字化的數稱為機器數,分別稱為符號位,數值位,是在計算機中的表示形式

(3)無符號數:整個機器字長的全部二進位制位均為數值位,沒有符號位,相當於數的絕對值

 

梳理一下:假設資料現在以8位表示

無符號數:最小0000 0000=0     最大1111 1111=255     範圍0~255

原碼: 最小負數 1111 1111=-127    最大正數 0111 1111 =+127      範圍-127~+127

               最小負數1. 111 1111=-(1-2^{-7})            最大正數0.111 1111=1-2^{-7}    範圍 -(1-2^{-7}

)  ~(1-2^{-7})  

反碼:最小負數 1000 0000=-127     最大正數 0111 1111 =+127         範圍-127~+127

            最小負數1. 000 0000=-(1-2^{-7})          最大正數0.111 1111=1-2^{-7}    範圍 -(1-2^{-7})  ~(1-2^{-7})  

原碼和反碼還需要注意的一點就是對於0 都有兩種表示,而補碼對於0的表示是唯一的,所以可以多表示一個負數。

補碼 : 最小負數:1000 0000=-128          最大正數:0111 1111=+127   範圍-128~+127

         最小負數 1,000 0000 =-1               最大正數0.111 1111=1-2^{-7}    範圍 -1 ~(1-2^{-7})  

這裡需要關注幾個特殊的取值。1000 0000 補碼錶示為-128                   1.000 0000補碼錶示為-1

                                                   1111 1111補碼錶示為-1.

這裡有沒有看出問題? 對於-1 我到底是該把它看成整數還是小數呢?表示是不一樣的!!!一定注意!

移碼: 最小負數:0000 0000=-128          最大正數:1111 1111=+127   範圍-128~+127

                        我們知道移碼的表示和補碼就是差了一個符號位,範圍同補碼。

                       我們說的移碼加偏置值表現為正數,這裡看上面的數很奇怪,沒錯的,它表現為正數,但是真值才是他代表的數。這樣寫的好處就是可以讓我們直接觀察二進位制程式碼,知道哪個數的確是大的,此處是為了解決補碼的缺陷。

在此對移碼的說法進行小結:對於移碼,假設n=8

                       真值(數值)表示範圍:-128~+127

                        機器數表示範圍:0~+255

 

浮點數:最大值: +\infty用階碼為255表示     最小值-\infty

             +0: 0000 0000 H       -0 8000 0000H

   正常情況下 最大的 數  2^{127}*(2-2^{-23})

                      最小的數2^{-126}

 

下面討論一下資料的位數,這就是17年大題的命題點

(0)unsigned short:無符號數短整型:佔16位

(1)unsigned int :無符號數整型:佔32位

(2)int :整型,資料位佔31位,符號位佔1位

(3)float:浮點型32 位格式,有效位數為24 位,隱藏1位,相當於7位十進位制有效數

(4)double:浮點型64位格式,有效位數為53位,隱藏1位,相當於17位十進位制有效數

 

例1:source:天勤

分析:思維的問題,有的時候,你不能執著於將數真的用二進位制程式碼表示出來,移碼可以從補碼的角度考慮,對於B選項,真值為-128,在求-x的時候發生溢位,是求不出結果的。所以本題你想用一個個列的方法不是一個好的選擇。

例2:source:2017年真題

           

好吧,分析本題非常有挑戰性,我盡力講的清楚,相信這也是對我自己知識的一種鞏固。

(1)在f1中其中定義了n 和i是無符號數,這就出現了一個問題:

  例:unsigned i,j   if(i-j<0)  實際上該條件是永遠也不成立的,無符號數就是無符號數。

所以第一問中就是無符號數的0-1=1111 1111 1111 1111 1111 1111 1111 1111這代表無符號數的最大數,i又是小於等於號,所以迴圈條件永遠成立,死迴圈。

當把i 和n都定義為int型之後,0-1的結果依然為1111 1111 1111 1111 1111 1111 1111 1111,但此時代表的是-1,此時條件不成立,迴圈體不會執行。

(2)f1(23)=24個1=  0000 0000 1111 1111 1111 1111 1111 1111=00FFFFFF H

      f2(23)=24個1=1111 1111 1111 1111 1111 1111=1.111 1111 1111 1111 1111 1111*2^{23}

          所以階碼的值應該為23+127=150 所以 機器數: 0 1001 0110 111 1111 1111 1111 1111 1111=4B7F FFFF H

所以返回值是相等的。這裡問的是機器數,我們現在知道的是真值,所以需要將其表示成在計算機中的形式。

(3)f1(24)=25個1= 1 1111 1111 1111 1111 1111 1111 =2^{25}-1=33 554 432-1=33554431(此處佩服命題老師這樣的數字都能想到,變態!)

        f2(24)=25個1,但是現在浮點型只能表示24位有效數字,怎麼辦?這裡採取了0舍1如的思想,加1之後還需要右規所以階碼加1=151.最後實際表示的數是1.0*2^{25}=33 554 432.0

此處的圖解

(4)f(31)=32個1=2^{32}-1

    f1(31)=32個1= 1111 1111 1111 1111 1111 1111 1111 1111=-1(這是要記住的,都是1代表-1)

所以為了使兩個值相等,就要是最高位代表符號位的這一位的ji結果為0,也就是說最多有31個1,所有最大的n是30

(5)機器數 7F80 0000 的階碼為為全1 代表 正無窮

為了使f2(n)的結果不溢位,,也就是在有舍入進位的情況下為254,減去127,結果為127,對比上題25個1,n為24,所以這裡最大的n為126

為了使f2(n)的結果精確,也就是最多24個1,則最大的n是23.

總結:資料的世界真精彩!