資料的範圍 碎碎念
實際上該篇文章的定位還是蠻高的,就像計算機網路中的特殊地址一樣,是不是幾乎每年必考?在計算機組成這門課裡,資料的範圍通常會以小題的形式考察,但不排除例外,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-) 最大正數0.111 1111=1- 範圍 -(1-
反碼:最小負數 1000 0000=-127 最大正數 0111 1111 =+127 範圍-127~+127
最小負數1. 000 0000=-(1-) 最大正數0.111 1111=1- 範圍 -(1-) ~(1-)
原碼和反碼還需要注意的一點就是對於0 都有兩種表示,而補碼對於0的表示是唯一的,所以可以多表示一個負數。
補碼 : 最小負數:1000 0000=-128 最大正數:0111 1111=+127 範圍-128~+127
最小負數 1,000 0000 =-1 最大正數0.111 1111=1- 範圍 -1 ~(1-)
這裡需要關注幾個特殊的取值。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
浮點數:最大值: 用階碼為255表示 最小值
+0: 0000 0000 H -0 8000 0000H
正常情況下 最大的 數
最小的數
下面討論一下資料的位數,這就是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*
所以階碼的值應該為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 ==33 554 432-1=33554431(此處佩服命題老師這樣的數字都能想到,變態!)
f2(24)=25個1,但是現在浮點型只能表示24位有效數字,怎麼辦?這裡採取了0舍1如的思想,加1之後還需要右規所以階碼加1=151.最後實際表示的數是1.0*=33 554 432.0
此處的圖解
(4)f(31)=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.
總結:資料的世界真精彩!