一、原理簡介
- 計算機(jī)在執(zhí)行程序的時候,組成程序的指令和程序鎖操作的數(shù)據(jù)都必須存儲在某個地方,這個地方就是計算機(jī)的內(nèi)存,也稱為RAM。可以將計算機(jī)的RAM想象一排井然有序的盒子。每個盒子都有兩個狀態(tài):滿為1,空為0.每個盒子稱為一個位(bit)。每8個位組成一個字節(jié),在計算機(jī)中,一個英文字母占一個字節(jié),一個中文漢字占兩個字節(jié)。
- 計算機(jī)中常用的單位是千字節(jié)(KB),兆字節(jié)(MB),千兆字節(jié)(GB)。1KB = 1024bit,1MB = 1024KB,1GB = 1024MB。
- 具體編譯系統(tǒng)分配給不同數(shù)據(jù)類型的內(nèi)存空間由編譯器決定,可在編譯器中由
sizeOf()
函數(shù)查看。
二、規(guī)范化的指數(shù)形式
- 在指數(shù)形式的多種表示方式中把小樹部分中小數(shù)點錢的數(shù)字為0,小數(shù)點后第一位數(shù)字不為0的表示形式稱為規(guī)范化的指數(shù)形式,如0.43242*10^1就是4.3242的規(guī)范化的指數(shù)形式。一個實數(shù)只有一個規(guī)范化的指數(shù)形式。
- 浮點數(shù)包括:float(單精度)、double(雙精度)、long double(長雙精度)。
三、關(guān)于溢出問題
- 以float舉例,
在內(nèi)存中分配4個字節(jié)(32位),但是4個字節(jié)有多少給小數(shù),有多少給指數(shù),是由c語言編譯系統(tǒng)自定的。
- 用
FLT_MIN
、FLT_MAX
查詢最大值最小值。
四、C/C++浮點數(shù)載內(nèi)存中的存儲方式
- 目前所有C/C++編譯器都是采用
IEEE754
所指定的標(biāo)準(zhǔn)浮點格式,即二進(jìn)制科學(xué)表示法。 - 在二進(jìn)制科學(xué)表示法中,
S = M*2^N
主要由三部分構(gòu)成:符號位 + 階碼(N)+尾數(shù)(M)
。對于 float 型數(shù)據(jù),其二進(jìn)制有32位,其中符號位1位,階位8位,尾數(shù)23位;對于 double 型數(shù)據(jù),其二進(jìn)制為64位,符號位1位,階位11位,尾數(shù)52位。- 符號位:0表示正,1表示負(fù)。
- 階碼:這里階碼采用
移碼表示
,對于float型數(shù)據(jù)其規(guī)定偏置量為127,階碼有正有負(fù),對于8位二進(jìn)制,其表示范圍為-128127,double型規(guī)定為1023,其表示范圍為-10241023.比如對于 float 型數(shù)據(jù),若階碼的真實值為 2,則加上127后為129,其階碼表示形式為1000010. - 尾數(shù):有效數(shù)字位,即部分二進(jìn)制位(小數(shù)點后面的二進(jìn)制位),因為規(guī)定M的整數(shù)部分恒為1,所以這個1就不進(jìn)行存儲了。
- 舉例說明:
- float型數(shù)據(jù)125.5轉(zhuǎn)換為標(biāo)準(zhǔn)浮點格式
- 計算125.5的二進(jìn)制
125/2 = 62...1
62 /2 = 31...0
31 /2 = 15...1
15 /2 = 7 ...1
7 /2 = 3 ...1
3 /2 = 1 ...1
1
整數(shù)125二進(jìn)制表示形式為:1111101
0.5*2 = 1
小數(shù)部分0.5的二進(jìn)制表示形式為:1
125.5的二進(jìn)制表示形式為:1111101.1 - 由于規(guī)定尾數(shù)的證書部分恒為1,則表示為
1.1111011*2^6
,階碼為6,6+127 = 133
,則表示為10000101,而對于尾數(shù)將整數(shù)部分1去掉,為1111011
,在其后面補(bǔ)0使其位數(shù)達(dá)到23位,則為11110110000000000000000。 - 二進(jìn)制表示為0 10000101 11110110000000000000000 在內(nèi)存中的存放方式:
00000000 低地址
00000000
11111011
01000010 高地址
- 反過來根據(jù)二進(jìn)制計算浮點數(shù):
0 10000101 11110110000000000000000- 符號位為0,則為證書。
- 階碼為133-127 = 6
- 尾數(shù)為1111011
- 大小為1.1111011*2^6,得到1111101.1,十進(jìn)制為125.5.
- 根據(jù)以上信息我們可以大約估計float的最大取值:
1.11111111111111111111111 * 2^127 = 3.4 * 10^38
----------- 小數(shù)位23個1-----------