目錄
創新互聯是專業的清鎮網站建設公司,清鎮接單;提供成都網站建設、網站制作,網頁設計,網站設計,建網站,PHP網站建設等專業做網站服務;采用PHP框架,可快速的進行清鎮網站開發網頁制作和功能擴展;專業做搜索引擎喜愛的網站,專業的做網站團隊,希望更多企業前來合作!一、浮點型和整型存儲方式一樣嗎?
二、浮點型的存儲規則
2.1? S,M,E求法
2.2 如何存放S,M,E?
2.2.1 IEEE 754規定
2.2.2 特別的規定
2.2.3? 驗證
2.3?取出規則
2.3.1 E不全為0或不全為1
2.3.2 E為全0
2.3.3?E為全1
2.3.4驗證
END.
嘗試著做一下,看答案是否和你想得相同,如果不一樣,那你算是找對文章了。


答案1:是以整型的方式存儲,以整型的方式取出
答案2:是以整型的方式存儲,以浮點型的方式取出
答案3:是以浮點型的方式存儲,以整型的方式取出
答案4:是以浮點型的方式存儲,以浮點型的方式取出
由此我們可以得知,整型的存儲方式和浮點型的存儲方式是不一樣的
二、浮點型的存儲規則 2.1? S,M,E求法根據國際標準IEEE 754,任何一個二進制的浮點數都能表示為以下方式
(-1)^S*M*2^E
浮點數為正數時S=0,反之S=1
M表示有效數字,在1~2之間(二進制)
2^E表示指數位
用一個實例來幫助大家理解
寫出5.5對應的式子
5.5的二進制:101.1(小數點右邊是從2的-1次方開始)
S=0(5.5為正數)
E=2(轉換成科學計數法:1.011小數點左移兩位)
M=1.011
2.2 如何存放S,M,E? 2.2.1 IEEE 754規定既然浮點型可以用SEM來表示,那我們存放這三個值是不是就間接的把數據存在內存中了
所以在內存中存放浮點型就是在存放SME


存儲M
在我們取M時會將它轉換為1.xxxxxxxx(范圍在1~2之間的數),如此我們存儲時會一直存放一個不變的數1
IEEE 754規定:在計算機保存M時,默認他的第一位永遠是1,因此可以將它舍去,只存儲小數點后的數據,這樣還可以提高精度
存儲E
當我們在內存中存儲E時,是從第二位開始的,沒有符號位,所以它是一個無符號整數
當它占8位時(float)數據范圍0~255,占11位時(double)數據范圍0~2047
但是,我們在實際計算中E是可能出現負數的比如0.5
0.5的二進制:0.1
S:0
M:1.0(科學計數法的形式,小數點向右移1位)
E:-1
當E出現負數,但內存中不能表示負數,因為他是無符號類型的
IEEE 754規定:再存入真實的E之前要加一個中間數,8位時加127,11位時加1023,如此就可以解決出現負數的情況
2.2.3? 驗證我們進行一個簡單的驗證,同時讓大家的記憶更加深刻

如果你在困惑內存中存放的為什么是倒過來的
這涉及到大小端的問題,在上一篇整型數據的存儲時詳細的講解了這個問題,在此就不過多贅述
【C語言】整型的存儲方式(大小端,原碼,反碼,補碼)
2.3?取出規則 2.3.1 E不全為0或不全為1S:存的什么就取出什么
E:當E的范圍是8位時(float),存的時候+127,取得時候-127,得到的就是真實值
當E的范圍是11位時(double),存的時候+1023,取得時候-1023,得到的就是真實值
M:存的時候,只存了小數點右邊的值,取出來的時候要在前面加上1
2.3.2 E為全0S:存的什么就取出什么
E:直接用1-127(1-1023)就為真實值
M:不用在加前面的1,直接是0.xxxxxxx
2.3.3?E為全1存放的是無窮大的數字,存取規則和第一種情況相同。
2.3.4驗證// 這個是上面5.5存進去的列子
// 0 10000001 01100000000000000000000
// S E M
// S =0 是正數
// E = (10000001)129 - 127 = 2
// M = 0.011+1 =1.011
// (-1)^S*M*2^E
// 由此可以寫出對應的數字了解了怎樣存儲和取出浮點型數據,開頭的那道程序是否有了不一樣的見解


答案1和答案4
他們就是整型的方式存儲,整型的方式取出,浮點型的方式存儲,浮點型的方式取出
這里解析答案2和答案3
int main()
{
int n = 9;
float* pFloat = (float*)&n;
//整型方式存進去的是補碼
//00000000000000000000000000001001 //9的原碼,正數的原反補相同
//浮點型的方式取出,就認為里面存的是浮點類型,要用浮點型的規則取出
//0 00000000 00000000000000000001001
//S E M
//S = 0
//E = 1-127 = -126
//M = 0.00000000000000000001001
//(-1)*0*0.00000000000000000001001 *2^-128
//是一個非常小的數字接近于0,float精度不夠,所以只能打印出0.000000
printf("*pFloat的值為:%f\n", *pFloat);
*pFloat = 9.0;
//浮點型的方式存進去,整型的方式取出來
//9的二進制:1001
// S = 0
// E = 3 +127 =130
// M = 1.001
//實際在內存中存儲的是
//0 10000010 00100000000000000000000
//用整型的方式取出,就認為存進去的是補碼(正數,原反補相同)
//01000001000100000000000000000000 (原碼)
//原碼換算成十進制為:1,091,567,616
printf("num的值為:%d\n", n);
return 0;
}有沒有一種豁然開朗的感覺呢?有沒有感覺到,生硬的規則下又透露出一絲絲的合理,讓我對前輩們又多了一份敬佩。
如果對整型的存儲有不清楚的地方,可以翻看我的另一篇文章.
【C語言】整型的存儲方式(大小端,原碼,反碼,補碼)
最后送給大家一句名言:
Genius only means hard-working all one's life. ——Mendeleyev? Russian chemist
天才只意味著終身不懈地努力。——俄國化學家 門捷列耶夫
你是否還在尋找穩定的海外服務器提供商?創新互聯www.cdcxhl.cn海外機房具備T級流量清洗系統配攻擊溯源,準確流量調度確保服務器高可用性,企業級服務器適合批量采購,新人活動首月15元起,快前往官網查看詳情吧
本文題目:【C語言】浮點型的存儲方式-創新互聯
路徑分享:http://www.yijiale78.com/article46/cdpeeg.html
成都網站建設公司_創新互聯,為您提供網站策劃、品牌網站建設、網站改版、電子商務、軟件開發、網站導航
聲明:本網站發布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創新互聯