float資料型別在記憶體中的儲存方式

2021-09-28 12:55:38 字數 1915 閱讀 7323

我們都很熟悉int型別在記憶體中的儲存方式,即直接按照二進位制方式儲存。我們可以通過以下c語言**讀取到記憶體中實際是如何儲存這些數字的。

int

main()

首先解釋為什麼是從*(p+3)從大到小逐個輸出:

這是因為我們生活中用的電腦都是以小端模式來儲存資料的,即資料的高位元組儲存在記憶體的高位址中,而資料的低位元組儲存在記憶體的低位址中。

這種儲存模式將位址的高低和資料位權有效地結合起來,高位址部分權值高,低位址部分權值低。

以12345為例,此段**輸出為 0, 0, 30, 39

我們也可以明顯觀察到,因為12345對於int可儲存的數的範圍很小,所以只有低位有數字,而高位址*(p+3)、*(p+2)則全部為0。

那麼現在來分析一下結果:0, 0, 30, 39

翻譯成二進位制即為0000 0000 0000 0000 0011 0000 0011 1001

所以2^13 + 2^12 + 2^5 + 2^4 + 2^3 + 2^0 = 12345

如果另有float型別變數f = (float)12345,無疑f會得到12345.000000的值。而如果令f = *(float *)&d,即把d所在的00, 00, 30, 39當做float來看待,得到的f為0

其實這並不是因為格式字串的問題,而是這個數如果作為float來看待的話,實在是太小了,我們不妨把d設定為1234567890,那麼f會得到1228890.250000這個值。

不過,不管怎麼看,這兩對數字都沒有任何關係,這就涉及到float型別的編碼問題了:

乙個浮點數在記憶體當中占用4位元組,由底數部分m與指數部分e組成。

第1位為符號位,標記該浮點數的正負,1為負數,0為正數。

第2-9位為指數部分e,與該浮點數擁有多少位整數部分相關。

第10-32位為底數部分m,以二進位制格式儲存實際資料。

所以,浮點數是這樣構成的:

seee eeee emmm mmmm mmmm mmmm mmmm mmmm

此處,我們用例項來證明:

int

main()

此**輸出結果為42, 7f, 0, 0

二進位制為0100 0010 0111 1111 0000 0000 0000 0000

其中,第一位0代表符號為正。

後面的10000100代表指數字。由於8位二進位制可以表示0-255的數字,但是指數應該是可正可負的,所以規定此二進位制數減去127才是真正的指數,float可表示指數的範圍為-127~128。

而10000100作為二進位制數,其值為2^7 + 2^2 = 132,指數應該為132-127 = 5

剩下的就是底數部分。因為底數部分的第一位總是1,所以略去不儲存。所以對於底數1111111000…00,其實應該是1.1111111000…00 * 2^5

我們知道對二進位制數每左移一位相當於乘以二,為了方便理解,我們把此二進位制數左移五位即可得到實際要表示的數,即111111.11000…00

也就是2^5 + 2^4 + 2^3 + 2^2 + 2^1 + 2^0 + 2^(-1) + 2^(-2) = 63.75,和前面一致。

我們可以再求乙個數的浮點數儲存格式來驗證,此處以53.25為例。

首先,53.25為正數,符號位應該為0

53.25的二進位制為110101.01,右移5位,得1.1010101。略去首位的1和小數點,也就是底數為1010101000…00,而指數為5+127=132,二進位制為10000100

實際儲存應該是0100 0010 0101 0101 0000 0000 00000 0000

轉化為16進製制數為42, 55, 0, 0

驗證:

int

main()

以上**執行結果 42, 55, 0, 0 驗證完畢。

Java基礎之float資料在記憶體中的儲存

1 float型別數字在計算機中用4個位元組儲存。遵循ieee 754格式標準 乙個浮點數有2部分組成 底數m和指數e。格式 seee eeee emmm mmmm mmmm mmmm mmmm mmmm s表示浮點數正負 e指數加上127後的值得二進位制資料 m底數2 底數部分 使用二進位制數來表...

float 型別在記憶體中的結構

float 在32位機上是 4個位元組的。它的結構是這樣子的 1位符號位 8 位指數字 23尾數字 其中指數是指以2 為底的指數,因為指數可能為負數,比如十進位制小數0.025,就是二進位制小數0.001 0 1 2 0 1 4 1 1 8 相當於1 2 的 3次方。所以規定指數字要加上127.eg...

float型別在記憶體中的儲存

首先還是看一道題目 include stdafx.h include include using namespace std int tmain int argc,tchar argv 125.5在記憶體中的表示為 125.5轉化為二進位制 1111101.1,變為整數字為1,位1.1111011 ...