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.如果物件完全不占用任何空間,那麼空...