目錄
創(chuàng)新互聯(lián)是專業(yè)的清鎮(zhèn)網(wǎng)站建設(shè)公司,清鎮(zhèn)接單;提供成都網(wǎng)站建設(shè)、網(wǎng)站制作,網(wǎng)頁設(shè)計(jì),網(wǎng)站設(shè)計(jì),建網(wǎng)站,PHP網(wǎng)站建設(shè)等專業(yè)做網(wǎng)站服務(wù);采用PHP框架,可快速的進(jìn)行清鎮(zhèn)網(wǎng)站開發(fā)網(wǎng)頁制作和功能擴(kuò)展;專業(yè)做搜索引擎喜愛的網(wǎng)站,專業(yè)的做網(wǎng)站團(tuán)隊(duì),希望更多企業(yè)前來合作!一、浮點(diǎn)型和整型存儲(chǔ)方式一樣嗎?
二、浮點(diǎn)型的存儲(chǔ)規(guī)則
2.1? S,M,E求法
2.2 如何存放S,M,E?
2.2.1 IEEE 754規(guī)定
2.2.2 特別的規(guī)定
2.2.3? 驗(yàn)證
2.3?取出規(guī)則
2.3.1 E不全為0或不全為1
2.3.2 E為全0
2.3.3?E為全1
2.3.4驗(yàn)證
END.
嘗試著做一下,看答案是否和你想得相同,如果不一樣,那你算是找對(duì)文章了。
答案1:是以整型的方式存儲(chǔ),以整型的方式取出
答案2:是以整型的方式存儲(chǔ),以浮點(diǎn)型的方式取出
答案3:是以浮點(diǎn)型的方式存儲(chǔ),以整型的方式取出
答案4:是以浮點(diǎn)型的方式存儲(chǔ),以浮點(diǎn)型的方式取出
由此我們可以得知,整型的存儲(chǔ)方式和浮點(diǎn)型的存儲(chǔ)方式是不一樣的
二、浮點(diǎn)型的存儲(chǔ)規(guī)則 2.1? S,M,E求法根據(jù)國際標(biāo)準(zhǔn)IEEE 754,任何一個(gè)二進(jìn)制的浮點(diǎn)數(shù)都能表示為以下方式
(-1)^S*M*2^E
浮點(diǎn)數(shù)為正數(shù)時(shí)S=0,反之S=1
M表示有效數(shù)字,在1~2之間(二進(jìn)制)
2^E表示指數(shù)位
用一個(gè)實(shí)例來幫助大家理解
寫出5.5對(duì)應(yīng)的式子
5.5的二進(jìn)制:101.1(小數(shù)點(diǎn)右邊是從2的-1次方開始)
S=0(5.5為正數(shù))
E=2(轉(zhuǎn)換成科學(xué)計(jì)數(shù)法:1.011小數(shù)點(diǎn)左移兩位)
M=1.011
2.2 如何存放S,M,E? 2.2.1 IEEE 754規(guī)定2.2.2 特別的規(guī)定既然浮點(diǎn)型可以用SEM來表示,那我們存放這三個(gè)值是不是就間接的把數(shù)據(jù)存在內(nèi)存中了
所以在內(nèi)存中存放浮點(diǎn)型就是在存放SME
存儲(chǔ)M
在我們?nèi)時(shí)會(huì)將它轉(zhuǎn)換為1.xxxxxxxx(范圍在1~2之間的數(shù)),如此我們存儲(chǔ)時(shí)會(huì)一直存放一個(gè)不變的數(shù)1
IEEE 754規(guī)定:在計(jì)算機(jī)保存M時(shí),默認(rèn)他的第一位永遠(yuǎn)是1,因此可以將它舍去,只存儲(chǔ)小數(shù)點(diǎn)后的數(shù)據(jù),這樣還可以提高精度
存儲(chǔ)E
當(dāng)我們?cè)趦?nèi)存中存儲(chǔ)E時(shí),是從第二位開始的,沒有符號(hào)位,所以它是一個(gè)無符號(hào)整數(shù)
當(dāng)它占8位時(shí)(float)數(shù)據(jù)范圍0~255,占11位時(shí)(double)數(shù)據(jù)范圍0~2047
但是,我們?cè)趯?shí)際計(jì)算中E是可能出現(xiàn)負(fù)數(shù)的比如0.5
0.5的二進(jìn)制:0.1
S:0
M:1.0(科學(xué)計(jì)數(shù)法的形式,小數(shù)點(diǎn)向右移1位)
E:-1
當(dāng)E出現(xiàn)負(fù)數(shù),但內(nèi)存中不能表示負(fù)數(shù),因?yàn)樗菬o符號(hào)類型的
IEEE 754規(guī)定:再存入真實(shí)的E之前要加一個(gè)中間數(shù),8位時(shí)加127,11位時(shí)加1023,如此就可以解決出現(xiàn)負(fù)數(shù)的情況
2.2.3? 驗(yàn)證我們進(jìn)行一個(gè)簡(jiǎn)單的驗(yàn)證,同時(shí)讓大家的記憶更加深刻
如果你在困惑內(nèi)存中存放的為什么是倒過來的
這涉及到大小端的問題,在上一篇整型數(shù)據(jù)的存儲(chǔ)時(shí)詳細(xì)的講解了這個(gè)問題,在此就不過多贅述
【C語言】整型的存儲(chǔ)方式(大小端,原碼,反碼,補(bǔ)碼)
2.3?取出規(guī)則 2.3.1 E不全為0或不全為1S:存的什么就取出什么
E:當(dāng)E的范圍是8位時(shí)(float),存的時(shí)候+127,取得時(shí)候-127,得到的就是真實(shí)值
當(dāng)E的范圍是11位時(shí)(double),存的時(shí)候+1023,取得時(shí)候-1023,得到的就是真實(shí)值
M:存的時(shí)候,只存了小數(shù)點(diǎn)右邊的值,取出來的時(shí)候要在前面加上1
2.3.2 E為全0S:存的什么就取出什么
E:直接用1-127(1-1023)就為真實(shí)值
M:不用在加前面的1,直接是0.xxxxxxx
2.3.3?E為全1存放的是無窮大的數(shù)字,存取規(guī)則和第一種情況相同。
2.3.4驗(yàn)證// 這個(gè)是上面5.5存進(jìn)去的列子
// 0 10000001 01100000000000000000000
// S E M
// S =0 是正數(shù)
// E = (10000001)129 - 127 = 2
// M = 0.011+1 =1.011
// (-1)^S*M*2^E
// 由此可以寫出對(duì)應(yīng)的數(shù)字
了解了怎樣存儲(chǔ)和取出浮點(diǎn)型數(shù)據(jù),開頭的那道程序是否有了不一樣的見解
答案1和答案4
他們就是整型的方式存儲(chǔ),整型的方式取出,浮點(diǎn)型的方式存儲(chǔ),浮點(diǎn)型的方式取出
這里解析答案2和答案3
int main()
{
int n = 9;
float* pFloat = (float*)&n;
//整型方式存進(jìn)去的是補(bǔ)碼
//00000000000000000000000000001001 //9的原碼,正數(shù)的原反補(bǔ)相同
//浮點(diǎn)型的方式取出,就認(rèn)為里面存的是浮點(diǎn)類型,要用浮點(diǎn)型的規(guī)則取出
//0 00000000 00000000000000000001001
//S E M
//S = 0
//E = 1-127 = -126
//M = 0.00000000000000000001001
//(-1)*0*0.00000000000000000001001 *2^-128
//是一個(gè)非常小的數(shù)字接近于0,float精度不夠,所以只能打印出0.000000
printf("*pFloat的值為:%f\n", *pFloat);
*pFloat = 9.0;
//浮點(diǎn)型的方式存進(jìn)去,整型的方式取出來
//9的二進(jìn)制:1001
// S = 0
// E = 3 +127 =130
// M = 1.001
//實(shí)際在內(nèi)存中存儲(chǔ)的是
//0 10000010 00100000000000000000000
//用整型的方式取出,就認(rèn)為存進(jìn)去的是補(bǔ)碼(正數(shù),原反補(bǔ)相同)
//01000001000100000000000000000000 (原碼)
//原碼換算成十進(jìn)制為:1,091,567,616
printf("num的值為:%d\n", n);
return 0;
}
有沒有一種豁然開朗的感覺呢?有沒有感覺到,生硬的規(guī)則下又透露出一絲絲的合理,讓我對(duì)前輩們又多了一份敬佩。
如果對(duì)整型的存儲(chǔ)有不清楚的地方,可以翻看我的另一篇文章.
【C語言】整型的存儲(chǔ)方式(大小端,原碼,反碼,補(bǔ)碼)
最后送給大家一句名言:
Genius only means hard-working all one's life. ——Mendeleyev? Russian chemist
天才只意味著終身不懈地努力?!韲瘜W(xué)家 門捷列耶夫
你是否還在尋找穩(wěn)定的海外服務(wù)器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機(jī)房具備T級(jí)流量清洗系統(tǒng)配攻擊溯源,準(zhǔn)確流量調(diào)度確保服務(wù)器高可用性,企業(yè)級(jí)服務(wù)器適合批量采購,新人活動(dòng)首月15元起,快前往官網(wǎng)查看詳情吧