天天看點

浮點數在記憶體中的存儲方式

浮點數在記憶體中的存儲方式

浮點數儲存的位元組格式如下:

位址        +0          +1           +2           +3

内容    SEEE EEEE   EMMM MMMM    MMMM MMMM    MMMM MMMM

這裡

S 代表符号位,1是負,0是正

E 偏移127的幂,二進制階碼=(EEEEEEEE)-127。

M 24位的尾數儲存在23位中,隻存儲23位,最高位固定為1。此方法用最較少的位數實作了

較高的有效位數,提高了精度。

零是一個特定值,幂是0 尾數也是0。

浮點數-12.5作為一個十六進制數0xC1480000儲存在存儲區中,這個值如下:

位址 +0     +1     +2     +3

内容0xC1   0x48   0x00   0x00

浮點數和十六進制等效儲存值之間的轉換相當簡單。下面的例子說明上面的值-12.5如何轉

換。

浮點儲存值不是一個直接的格式,要轉換為一個浮點數,位必須按上面的浮點數儲存格式表

所列的那樣分開,例如:

位址       +0           +1            +2            +3

格式   SEEE EEEE    EMMM MMMM     MMMM MMMM     MMMM MMMM

二進制  11000001     01001000      00000000      00000000

十六進制   C1           48            00            00

從這個例子可以得到下面的資訊:

  符号位是1 表示一個負數

  幂是二進制10000010或十進制130,130減去127是3,就是實際的幂。

  尾數是後面的二進制數10010000000000000000000

在尾數的左邊有一個省略的小數點和1,這個1在浮點數的儲存中經常省略,加上一個1和小數

點到尾數的開頭,得到尾數值如下:

1.10010000000000000000000

接着,根據指數調整尾數.一個負的指數向左移動小數點.一個正的指數向右移動小數點.因為

指數是3,尾數調整如下:

1100.10000000000000000000

結果是一個二進制浮點數,小數點左邊的二進制數代表所處位置的2的幂,例如:1100表示

(1*2^3)+(1*2^2)+(0*2^1)+(0*2^0)=12。

小數點的右邊也代表所處位置的2的幂,隻是幂是負的。例如:.100...表示(1*2^(-1))+

(0*2^(-2))+(0*2^(-2))...=0.5。

這些值的和是12.5。因為設定的符号位表示這數是負的,是以十六進制值0xC1480000表示-

12.5。

關于多位元組資料類型在記憶體中的存儲問題

int ,short 分别是4、2位元組。他們在記憶體中的存儲方式下面舉個例子說明。

int data = 0xf4f3f2f1;

其中低位存放在編址小的記憶體單元,高位存放在編址高的記憶體單元

如下:

位址:0x8000      0x8001    0x8002   0x8003

資料:   f1              f2            f3          f4

根據IEEE在1985年制定的标準來處理浮點數

單精度浮點數用4位元組,包括1位符号位s(整數為0,負數為1),8位指數位e,23位有效位f

浮點型使用的是科學計數法,比如十進制的12345可以表示為1.2345 * 10^4(表示10的4次幂)

用二進制表示為 1.1000000111001 * 2^13

是以計算機中用浮點數表示12345這個十進制應該是這樣的,s位為0,因為是正數,指數位為13+127=140(127為單精度浮點數偏移值,為了表示隻有小數部分的數),有效位為1000000111001

計算的時候用 (-1)^s * 1.f * 2^(e-127) ,結果就是 1* 1.1000000111001 * 2^(140-127=13) ,和我們剛才表示的一樣

還比如,十進制小數0.125轉換為二進制小數0.001可以表示為 1* 1.0 * 2^(124-127=-3)

double,雙精度浮點數有1位符号位、11位指數位和52位有效數

謝謝,和我找的資料差不多:)

知道公式

n=(-1)^s*m*2^e

e=|E|-bias

bias = 2^(k-1)-1(k為E的位數)

m=|1.M|

知道12345在記憶體中的10進制表示以後

0x4640e400 = 0(100 0110 0)<100 0000 1110 0100 0000>

括号中的數字為|E| = 140 是以e=140-127=13

尖括号中的數字為m=|1.M|=|1.100000011100100|=1.506958008

ok,

代入公式n = (-1)^0*1.506958008*2^13=12345

完工!!

來自http://blog.chinaunix.net/uid-9950859-id-98886.html

繼續閱讀