浮點型變數的儲存格式

2021-09-30 08:54:55 字數 2134 閱讀 1571

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提供更高的精度,對絕大多數程式來說夠用了。...