JVM1:計算機中整形和浮點型二進制保存的具體形式

整數的表示:

原碼:

一個數在計算機中的二進制表示形式

第一位是符號位(0爲正數,1爲負數)

反碼:

負數反碼:符號位不動,按位取反

正數補碼:和原碼相同

補碼

負數補碼:符號位不動,反碼加1

正數補碼:和原碼相同

 

爲什麼要用補碼 , 我們以8位的數字1爲例來說明:

首先計算機的設計只有加法運算 ,不區分符號位  ,如果最高位(符號位)有進位,則進位就捨棄 , 而且所有的位數都要參與加法運算。

+1 : 原碼 = 反碼 = 補碼  = 0000 0001

-1: 原碼  = 1000 0001;反碼 =1111 1110;補碼=11111111;

原碼計算: +1- 1 = (+1) + (-1)= (0000 0001)+(1000 0001)=(1000 0010) =-2可以看到如果是原碼計算減法,符號位也參與計算的話,結果明顯不正確

反碼計算: +1- 1 = (+1) + (-1)= (0000 0001)+(1111 1110)=(1111 1111)=(1000 0000)=0以看到反碼計算減法,真值部分是正確的,但是得出的結果是 -0:[0000 0000]和[1000 0000]都表示0

補碼計算 : +1 - 1 = (+1) + (-1)= (0000 0001)+ (1111 1111)= (0000 0000)= (0000 0000)= 0可以看到補碼計算減法 ,就避免了-0的問題因爲(1000 0000) + (0000 0001) = (1000 0001)= (1111 1111))= -127所以(1000 0000)用來表示 -128 , (1000 0000)沒有相應的原碼和反碼。

補碼原理 :因爲-n = 0 - n ,而且相加時候 ,如果高位溢出就直接捨棄 ,所以我們計算0 - n的時候把高位還原回來。-1爲例 ,-1 = 0 - 1 = (0000 0000) - (0000 0001) = (1 0000 0000) - (0000 0001) = (11111111)

補碼的好處:使用補碼,不僅僅修復了0的符號以及存在兩個編碼的問題,而且還能夠多表示一個最低數。這就是爲什麼8位二進制,使用原碼或反碼錶示的範圍爲[-127, +127],而使用補碼錶示的範圍爲[-128, 127]。

 

浮點數的定義與表示 , IEEE規定的單精度浮點數內部構造如下:




1. 第一段s 是符號位(0爲正數,1爲負數)

2. 第二段e 是指數域  , 採用移位存儲 , 共計8bit

3. 第三段m 是尾數 , 共計23bit

4. 在計算機中, 任何一個浮點數都可以用二進制的科學計數法表示都爲1.xxx*2n  , 尾數部分就是xxx , 因爲第一位固定位1 , 所以23bit的尾數部分其實表示的是24bit的數據  ;  例如 8.25用二進制表示可表示爲1000.01 , 用二進制的科學計數法表示1000.01可以表示爲1.0001*23  ; 例如 0.125用二進制表示可表示爲0.001 , 用二進制的科學計數法表示0.001可以表示爲1.0*2-3

5. 指數部分是8位的浮點數時,基數就定爲 0111 111 及 127,比127小的數表示負數,比127大的表示正數 , 所以1.0001*23的指數部分就爲(127+3) , 1.0*2-3指數部分就爲(127-3)

6. 所以8.25在計算機內存中保存的二進制數據爲 : 0-130-00001 , 0.125在內存中的表示爲 0-124-0

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章