整數的表示:
原碼:
一個數在計算機中的二進制表示形式
第一位是符號位(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