1. 程式人生 > >補碼,反碼,原碼的範圍總結

補碼,反碼,原碼的範圍總結

剛剛碰到一個題目,需要寫出一種浮點數範圍的題。
原題如下
假定一種浮點數格式是1位數符,7位階碼,8位尾數。其中尾數用補碼表示,階碼用移碼表示。
問,此格式可以表示的資料範圍。

無疑,我們不用關注下溢的問題,只用找出最大正值和最小負值即可。

這裡有兩個重點:階碼的表示範圍和尾數能夠表達的範圍。

我們知道IEEE754的尾數是用原碼錶示,預設高位是1,在補碼這裡沒有。我們純粹關心8位補碼能表示多大的小數即可。

而當一論到補碼時,莫名就恐慌起來。今天總結到這裡,梳理清楚思考路徑。

我們知道原碼的範圍很好求,因為很自然,而反碼呢,只是表示與原碼不同,意義相同。所以範圍一致。而反碼和補碼也只相差一位,即是否加1,所以,它們三都可以用原碼去思考。唯一不同的是,原碼和反碼都有一個-0,而這個-0在補碼那裡用於表示-1,或者最小的負數。比如8位表示整數,其中一位是符號位,那麼,正數最大是2

71=127, 負數最小是-128。
而小數的話,因為數符已經有了,不用再拿出一位表示符號,因此這8位小數就表示純粹的小數。

另外,這個區別於IEEE754標準,因為單精度浮點數兩個地方是特殊的。

  • 偏置值是2811,也即單精度是127
  • 尾數用原碼且預設高位是1,隱含起來了

但在這裡呢,就是純粹的編碼計算問題。

因此,8位補碼小數的範圍:由原碼可知,最大小數是0.11111111(8個1) = 1 - 2^(-8),最小負數是-1.

再看階碼,由7位(1位字元,6位資料)組成,因此最大可表示的階碼(連通最高位一起)是20+21+...+26=271=127,偏置值取2(71

)=64
所以最大是127-64 = 63.

或者直接根據與補碼錶示範圍相同推知,表示範圍是[26,261]=[64,63]

在IEEE754中,階碼的最大值是254,範圍是1-254,留了兩個階碼值狀態:0,255表示規格化和無窮大。
這裡的表示不用這麼考慮。

所以範圍可定:1128)263

以上。