java整數和浮點數儲存原理

2021-08-17 23:38:45 字數 2547 閱讀 4904

整數的儲存方式:計算機用二進位制來表示整數,最高位是符號位

整形資料在記憶體中是以2進製本數的補碼存在的;

但正整數的補碼還是原來的2進製,而負數則要先取反再+1才是它的補碼,(

+1後的最左邊以為就是符號位,1為負,0為正;

)比如-10的二進位制:

1、先取-10的絕對值的二進位制數值,為0000000000001010;   

2、取反,1111111111110101    

3、加1:1111111111110110;  這個就是-10在記憶體中的儲存形式;

浮點數的儲存方式:

首先了解如何用二進位制表示小數(也就是如何把十進位制小數轉化為二進位制表示):

舉乙個簡單例子,十進位制小數 10.625

1)首先轉換整數部分:10 = 1010b

2)小數部分0.625 = 0.101b

(用「乘2取整法」:0.625*2=1.25,得第一位為1,0.25*2=0.5,得第二位為0,0.5*2=1, 得第三位為1,餘下小數部分為零,就可以結束了)

3)於是得到 10.625=1010.101b

換個表示方式更加深入理解:

1*(10^1)+0*(10^0)+6*(10^-1)+2*(10^-2)+5*(10^-3) =

1*(2^3) + 0*(2^2) + 1*(2^1) + 0*(2^0) + 1*(2^-1) + 0*(2^-2) + 1*(2^-3)

4) 類似十進位制可以用指數形式表示:

10.625=10625*(10^-3)

所得的二進位制小數也可以這樣指數形式表述:

1010.101b=1010101 * (2^-3)

也就是用有效數字a和指數e來表述: a * (2^e)

用乙個32bit的空間(bit0~bit31)來儲存這麼乙個浮點數,如此分配儲存空間:

bit0 ~ bit22 共23bit,用來表示有效數字部分,也就是a,本例中a=1010101

bit23 - bit30 共8個bit,用來表是指數,也就是e,範圍從-128到127,實際資料中的指數是原始指數加上127得到的,如果超過了127,則從-128開始計,所以這裡e=-3表示為124

bit31 為符號位,1表示負數,這裡應該為0

把上述結果填入32bit的儲存器,就是計算機表示小數10.625的形式。

注意這個例子的特殊性:它的小數部分正好可以用有限長度的2進製小數表示,因此,而且整個有效數字部分a的總長度小於23,因此它精確的表示了10.625,但是有的情況下,有效數字部分的長度可能超過23,甚至是無限多的,那時候就只好把後面的位數截掉了,那樣表示的結果就只是乙個近似值而非精確值;顯然,儲存長度越長,精度就越高,比如雙精度浮點數長度為64位,1位符號位,11位指數字,52位有效數字。

1, ieee的浮點數格式

短(單精度float)實數: 32位   1位符號  8位指數  23位尾數 

長(雙精度double)實數:64位   1位符號  11位指數 52位尾數 

2, float和double都的尾數含有乙個隱含為1,擴充套件性雙精度則沒有這個限制

3, 小數轉換成二進位制時,指數需要加上127

以單精度為例,闡述將10.25與二進位制互相轉換過程:

a, 將10.25轉換成二進位制數,

a, 轉換整數部分 10 = 1*(2^3)+0*(2^2)+1*(2^1)+0*(2^0)

b, 轉換小數部分,使用"乘2取整"的辦法 (0.25*2=0.5) 0 (0.5*2=1) 1  0.25=01

c, 把數字寫成規格化的二進位制數形式, 10.25=1010.01=1.01001*(2^3) 3就是指數 1.01001捨棄最高位的1變成就是尾數01001(為什麼要捨棄,因為1是隱含位,即所有的小數轉換後整數部分都是1)

d, 將指數加上127轉換成二進位制就得到了8位的指數字 3+127 = 130 轉換成二進位制 1000 0010

e, 根據浮點數的格式可以寫出10.25的二進位制數表示了:

10.25的二進位制數是: 0 1000 0010 01001 0000 0000 0000 0000 000

b,將二進位制數還原成浮點數:0 1000 0010 01001 0000 0000 0000 0000 000

a, 去掉最高位的符號位變成 1000 0010 01001 0000 0000 0000 0000 000

b, 取用來表示指數的8位 1000 0010  因為在浮點數轉換成二進位制是指數是加過127的,所以這時要減去127,130-127=3,所以指數是3

c, 取剩下的23位 01001 0000 0000 0000 0000 000, 這23位實際上就是小數部分,在浮點數轉換成二進位制時,我們捨棄了最高位的1,所以要補回來當做整數,就變成了1.01001 0000 0000 0000 0000 000,由於指數是3,所以要乘上我們的指數,

1.01001 0000 0000 0000 0000 000 * (2^3) = 1010.01 0000 0000 0000 0000 000

d, 將1010.01 0000 0000 0000 0000 000小數點左邊的轉換成十進位制整數就是10,進小數點右邊轉換成小數就是0.25=(0*2^(-1)+1*(2^-2))

整數和浮點數

python支援對整數和浮點數直接進行四則混合運算,運算規則和數學上的四則運算規則完全一致。基本的運算 1 2 3 6 4 5 6 14 7.5 8 2.1 3.0375使用括號可以提公升優先順序,這和數 算完全一致,注意只能使用小括號,但是括號可以巢狀很多層 1 2 3 9 2.2 3.3 1.5...

浮點數 儲存

關鍵字 體系結構 ieee754 浮點數 儲存 main 如果不執行上面的 讓我們來直接判斷,輸出的結果會是什麼?而在你執行程式之後,結果卻很讓人詫異 123.456001。為什麼會是123.456001?有六位小數可以理解,最後那個1是為何?有很多人解釋說最後那個1是亂碼,隨機的。嘿嘿 其實無論你...

整數與浮點數

整數和浮點數可以一起運算 四則運算 加法 num1 10 num2 0.5 reault num1 num2 print result 10.5 減法result num1 num2 print result 9.5 乘法result num1 mun2 print result 5 除法resul...