C語言中得到一個float值在記憶體中的16進製表示
float佔據4個位元組32位,1位為符號位,8位指數位,23位尾數位。
例
將72.65f轉為為16進製表示
第一步:將浮點數轉換為二進位制顯示
將72.65f轉換為二進位制顯示形式為 100 1000. 101 0011 0011 0011...
整數部分轉換方法為 72不斷地除以2取餘,然後從後往前排列
72/2 = 36 餘0
36/2 = 18 餘0
18/2 = 9 餘0
9 /2 = 4 餘1
4 /2 = 2 餘0
2 /2 = 1 餘0
1 /2 = 0 餘1
所以整數部分為 100 1000
小樹部分轉換方法為,0.65不斷地乘以2 取整數部分,然後從前往後排列
0.65 * 2 = 1.3 取1
0.3 * 2 = 0.6 取0
0.6 * 2 = 1.2 取1
0.2 * 2 = 0.4 取0
0.4 * 2 = 0.8 取0
0.8 * 2 = 1.6 取1
0.6 * 2 = 1.2 取1
.
.
.
所以小數部分為101 0011 0011 0011 ...合併起來就是100 1000. 101 0011 0011 0011 ...
第二步:將小數點向左移動,直至到第一個1的右邊,記下移動的步數
100 1000. 101 0011 0011 0011... 將小數點向左移動6步,然後數字為1.0010 0010 1001 1001 1001 1001 ...
小數點後面的即為最終結果的小數部分,取23位有效數字,將23位以後的捨棄,第24為1,向前進一位(如果為0,
直接捨棄),為1.0010 0010 1001 1001 1001 101,將小數點左邊的1丟掉為.0010 0010 1001 1001 1001 101
我們移動了6步,對6進行偏移127為133 ,二進位制為 1000 0101,將這個值作為最終結果的指數部分
第三步:將整數部分小數部分對接
1000 0101 . 0010 0010 1001 1001 1001 101
現在一共是8 + 23 = 31 位,此時再在前面加上一位符號位0(正數為0,負數為1)
結果是0 1000 0101 0010 0010 1001 1001 1001 101
寫的更直觀一點 0100 0010 1001 0001 0100 1100 1100 1101
第四步:將二進位制轉換為十六進位制
即為42914ccd
所以72.65f的十六進位制為 42914ccd,如果我們在VS中將一個float變數賦值為72.65f的話,開啟記憶體視窗,
選擇4位元組整數顯示,找到該變數的起始地址,可以看見裡面填充的值就是 42914ccd