C float的記憶體布局

2022-03-06 05:24:06 字數 1951 閱讀 8102

ieee754標準中,浮點數的記憶體布局

以下僅以float(記憶體中佔據4個位元組,32bits)來說明,double(8個位元組,64bits)同理,只是有細微的差別。

float的記憶體分布

ieee754規定,32bit的float在記憶體中是這樣分布的:

符號位(s)

階碼(e)

尾數(m)18

23整數、浮點數在記憶體中都是以二進位制的形式存在的(補碼),而浮點數是二進位制下的科學計數法儲存在記憶體中的。可以表示 為:$ s 1.m^e$

計算例項

1, 十進位制與二進位制的互轉

二進位制轉十進位制比較簡單,就是對應位乘以對應的2的冪次,比如:101.1011,其轉換過程為:

$$1*2^2 + 0 * 2^1 + 1 * 2^0 + 1 * 2^ + 0 * 2^ + 1 * 2^ + 1 * 2^$$

十進位制整數轉二進位制比較簡單,一是8421來湊,一是除2倒序排,不再解釋。

十進位制小數轉二進位制,就是一直乘2,如果大於1,則置1,如果小於1,則置0,一直乘2,直到為0或達到指定位數為止。

比如0.125:

$$ 0.25 * 2 = 0.5 --- 0 \\

0.5 * 2 = 1 --- 1$$

則其二進位制為:0.01。

再比如:0.632:

$$ 0.632 * 2 = 1.264 --- 1 \\

0.264 * 2 = 0.528 ---0 \\

0.528 * 2 = 1.056 ---1 \\

0.056 * 2 = 0.112 ---0 \\

...$$

則其二進位制為:0.1010….。

2, 計算float的記憶體布局

2.1 考慮float fa = 4.25,那麼:int ia = *(int*)&fa是多少呢?

我們知道,4.25 = 100.01,化成指數表示為:$1.0001*2^2$,則其符號位s = 0, 階碼e = 2 + 127 = 0x81,其尾數部分二進位制表示為:1000 1000 0000 0000 0000 0000,總共24位,將尾數的最高位的1去掉,再與階碼e,符號位s組合後:

符號位(s)

階碼(e)

尾數(m)

01000 0001

000 1000 0000 0000 0000 0000

合起來就是:

0100 0000 1000 1000 0000 0000 0000 0000,即:ia = 0x40880000

2.2 再考慮float fa = -0.0125,那到:c++ int ia = *(int*)&fa是多少呢?

-0.0125 = -0.00000011001100110011001100...,轉換成指數為:$-1.10011001100110011001100…*2^$,則其符號位s = 1,階碼e = -7 + 127 = 0x78,其尾數部分用二進位制表示為:1100 1100 1100 1100 1100 1101,後面的位數就被四捨五入截斷了,由於最後一位的後一位是1,則向前進1,同樣保留24位,將其最高位的1去掉,再與階碼和符號位組合:

符號位(s)

階碼(e)

尾數(m)

10111 1000

100 1100 1100 1100 1100 1101

全起來就是:

1011 1100 0100 1100 1100 1100 1100 1101,即:ia = 0xbc4ccccd

如果將ia轉換成fa,則轉換過程相反。

來自為知筆記(wiz)

struct的記憶體布局

這段 的輸出結果是多少?4 1 5?那你就錯了 是8!為了cpu取數方便,提高效率,編譯器一般會把資料安排到合適的位置 一般數在記憶體中存放的起始位址都是4的倍數,稱為 4位元組對齊 所以在這裡,char雖然只佔1位元組,但是後面也給它填充3個位元組,湊夠4個位元組 struct s struct ...

OC的記憶體布局

在 usr include objc objc.h 有定義 struct objc class typedef struct objc class class class是乙個objc class結構體的指標 typedef struct objc object id 很明顯,乙個物件的第1個元素,...

Object的記憶體布局

物件在記憶體中的長度不一定等於sizeof member 1 sizeof member 2 sizeof member n 因為有三種情況需要考慮 1.空類 空類中沒有任何資料成員,按理說此類的物件長度為0,則不佔任何空間.但實際情況是,空類的長度為1 byte.如果物件完全不占用任何空間,那麼空...