補碼,反碼,原碼的範圍總結
剛剛碰到一個題目,需要寫出一種浮點數範圍的題。
原題如下
假定一種浮點數格式是
問,此格式可以表示的資料範圍。
無疑,我們不用關注下溢的問題,只用找出最大正值和最小負值即可。
這裡有兩個重點:階碼的表示範圍和尾數能夠表達的範圍。
我們知道IEEE754的尾數是用原碼錶示,預設高位是1,在補碼這裡沒有。我們純粹關心8位補碼能表示多大的小數即可。
而當一論到補碼時,莫名就恐慌起來。今天總結到這裡,梳理清楚思考路徑。
我們知道原碼的範圍很好求,因為很自然,而反碼呢,只是表示與原碼不同,意義相同。所以範圍一致。而反碼和補碼也只相差一位,即是否加1,所以,它們三都可以用原碼去思考。唯一不同的是,原碼和反碼都有一個-0,而這個-0在補碼那裡用於表示-1,或者最小的負數。比如8位表示整數,其中一位是符號位,那麼,正數最大是
而小數的話,因為數符已經有了,不用再拿出一位表示符號,因此這8位小數就表示純粹的小數。
另外,這個區別於IEEE754標準,因為單精度浮點數兩個地方是特殊的。
- 偏置值是
28−1−1 ,也即單精度是127 - 尾數用原碼且預設高位是1,隱含起來了
但在這裡呢,就是純粹的編碼計算問題。
因此,8位補碼小數的範圍:由原碼可知,最大小數是0.11111111(8個1) = 1 - 2^(-8),最小負數是-1.
再看階碼,由7位(1位字元,6位資料)組成,因此最大可表示的階碼(連通最高位一起)是
所以最大是127-64 = 63.
或者直接根據與補碼錶示範圍相同推知,表示範圍是
在IEEE754中,階碼的最大值是254,範圍是1-254,留了兩個階碼值狀態:0,255表示規格化和無窮大。
這裡的表示不用這麼考慮。
所以範圍可定:
以上。