一、原理簡介
- 計算機在執(zhí)行程序的時候,組成程序的指令和程序鎖操作的數(shù)據(jù)都必須存儲在某個地方,這個地方就是計算機的內(nèi)存,也稱為RAM。可以將計算機的RAM想象一排井然有序的盒子。每個盒子都有兩個狀態(tài):滿為1,空為0.每個盒子稱為一個位(bit)。每8個位組成一個字節(jié),在計算機中,一個英文字母占一個字節(jié),一個中文漢字占兩個字節(jié)。
- 計算機中常用的單位是千字節(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所指定的標準浮點格式,即二進制科學(xué)表示法。 - 在二進制科學(xué)表示法中,
S = M*2^N主要由三部分構(gòu)成:符號位 + 階碼(N)+尾數(shù)(M)。對于 float 型數(shù)據(jù),其二進制有32位,其中符號位1位,階位8位,尾數(shù)23位;對于 double 型數(shù)據(jù),其二進制為64位,符號位1位,階位11位,尾數(shù)52位。- 符號位:0表示正,1表示負。
- 階碼:這里階碼采用
移碼表示,對于float型數(shù)據(jù)其規(guī)定偏置量為127,階碼有正有負,對于8位二進制,其表示范圍為-128127,double型規(guī)定為1023,其表示范圍為-10241023.比如對于 float 型數(shù)據(jù),若階碼的真實值為 2,則加上127后為129,其階碼表示形式為1000010. - 尾數(shù):有效數(shù)字位,即部分二進制位(小數(shù)點后面的二進制位),因為規(guī)定M的整數(shù)部分恒為1,所以這個1就不進行存儲了。
- 舉例說明:
- float型數(shù)據(jù)125.5轉(zhuǎn)換為標準浮點格式
- 計算125.5的二進制
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二進制表示形式為:1111101
0.5*2 = 1
小數(shù)部分0.5的二進制表示形式為:1
125.5的二進制表示形式為:1111101.1 - 由于規(guī)定尾數(shù)的證書部分恒為1,則表示為
1.1111011*2^6,階碼為6,6+127 = 133,則表示為10000101,而對于尾數(shù)將整數(shù)部分1去掉,為1111011,在其后面補0使其位數(shù)達到23位,則為11110110000000000000000。 - 二進制表示為0 10000101 11110110000000000000000 在內(nèi)存中的存放方式:
00000000 低地址
00000000
11111011
01000010 高地址
- 反過來根據(jù)二進制計算浮點數(shù):
0 10000101 11110110000000000000000- 符號位為0,則為證書。
- 階碼為133-127 = 6
- 尾數(shù)為1111011
- 大小為1.1111011*2^6,得到1111101.1,十進制為125.5.
- 根據(jù)以上信息我們可以大約估計float的最大取值:
1.11111111111111111111111 * 2^127 = 3.4 * 10^38
----------- 小數(shù)位23個1-----------