一、原理簡介
- 計算機在執(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
所指定的標(biāo)準(zhǔn)浮點格式涝动,即二進制科學(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表示負(fù)勇垛。
- 階碼:這里階碼采用
移碼表示
脖母,對于float型數(shù)據(jù)其規(guī)定偏置量為127,階碼有正有負(fù)闲孤,對于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)換為標(biāo)準(zhǔ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-----------