float的記憶體結構,我用乙個帶位域的結構體描述如下:
struct myfloat
bool bsign : 1; // 符號,表示正負,1位
char cexponent : 8; // 指數,8位
unsigned long ulmantissa : 23; // 尾數,23位
符號就不用多說了,1表示負,0表示正
指數是以2為底的,範圍是 -128 到 127,實際資料中的指數是原始指數加上127得到的,如果超過了127,則從-128開始計,其行為和x86架構的cpu處理加減法的溢位是一樣的。
比如:127 + 2 = -127;-127 - 2 = 127
尾數都省去了第1位的1,所以在還原時要先在第一位加上1。它可能包含整數和純小數兩部分,也可能只包含其中一部分,視數字大小而定。對於帶有整數部分的浮點數,其整數的表示法有兩種,當整數大於十進位制的16777215時使用的是科學計數法,如果小於或等於則直接採用一般的二進位制表示法。科學計數法和小數的表示法是一樣的。
小數部分則是直接使用科學計數法,但形式不是x * ( 10 ^ n ),而是x * ( 2 ^ n )。拆開來看。
0 00000000 0000000000000000000000
符號位 指數字 尾數字
例項:12.5:
1. 整數部分12,二進位制為1100; 小數部分0.5, 二進位制是.1,先把他們連起來,從第乙個1數起取24位(後面補0):
1100.10000000000000000000
這部分是有效數字。(把小數點前後兩部分連起來再取掉頭前的1,就是尾數)
2. 把小數點移到第乙個1的後面,需要左移3位, 加上偏移量127:127+3=130,二進位制是10000010,這是階碼。
3. -12.5是負數,所以符號位是1。把符號位,階碼和尾數連起來。注意,尾數的第一位總是1,所以規定不存這一位的1,只取後23位:
1 10000010 10010000000000000000000
把這32位按8位一節整理一下,得:
11000001 01001000 00000000 00000000
就是十六進製制的 c1480000.
2.025675
1. 整數部分2,二進位制為10; 小數部分0.025675, 二進位制是.0000011010010010101001,先把他們連起來,從第乙個1數起取24位(後面補0):
10.0000011010010010101001
這部分是有效數字。把小數點前後兩部分連起來再取掉頭前的1,就是尾數: 00000011010010010101001
2. 把小數點移到第乙個1的後面,左移了1位, 加上偏移量127:127+1=128,二進位制是10000000,這是階碼。
3. 2.025675是正數,所以符號位是0。把符號位,階碼和尾數連起來:
0 10000000 00000011010010010101001
把這32位按8位一節整理一下,得:
01000000 00000001 10100100 10101001
就是十六進製制的 4001a4a9.
-1.99744
還需要詳細說嗎?
如果只有小數部分,那麼需要右移小數點. 比如右移3位才能放到第乙個1的後面, 階碼就是127-3=124.
補充乙個浮點二進位制數手工轉換成十進位制數的例子:
假設浮點二進位制數是 1011 1101 0100 0000 0000 0000 0000 0000
按1,8,23位分成三段:
1 01111010 10000000000000000000000
最後一段是尾數。前面加上"1.", 就是 1.10000000000000000000000
下面確定小數點位置。階碼是01111010,加上00000101才是01111111(127),
所以他減去127的偏移量得-5。(或者化成十進位制得122,122-127=-5)。
因此尾數1.10(後面的0不寫了)是小數點右移5位的結果。要復原它就要左移5位小數點,得0.0000110, 即十進位制的0.046875
最後是符號:1代表負數,所以最後的結果是 -0.046875
還要注意其他機器的浮點數表示方法可能與此不同. 不能任意移植.
C 浮點型變數的儲存方式
浮點型是c 定義的基本型別。型別float double和long double分別表示單精度浮點數 雙精度浮點數和擴充套件精度浮點數。在visual studio中,float型別用4個位元組表示,double和long double用8個位元組表示。預設的浮點字面值常量為double型別。在數值...
浮點型在記憶體中的儲存
以單精度型別變數為例 1.國際標準ieee 電氣和電子工程協會 754,任意乙個浮點數都可以表示為 1 s m 2 e,其中 1 s表示符號位,當資料為負時s 1,當資料為正時s 0 2 m表示有效數字位,它在記憶體中佔據23個位元位,它的取值範圍是大於等於1,小於2,而計算機對m進行存的時候只存小...
C 浮點型的儲存方式詳解
目錄 有些時候需要變數能儲存帶小數點的數,或者能儲存極大數或極小數。這類數可以用浮點 因小數點是 浮動的 而得名 格式進行儲存。c語言提供了3種浮點型別,對應三種不同的浮點格式。當精度要求不嚴格時 小數點後少於六位 float型別是很適合的型別。double提供更高的精度,對絕大多數程式來說夠用了。...