<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
本文接著學習資料的儲存相關的內容,主要學習浮點型數在記憶體中的儲存與取出。
int main() { int n = 9; float *pFloat = (float*)&n; printf("n的值為:%dn",n); printf("*pFloat的值為:%fn",*pFloat); *pFloat = 9.0; printf("num的值為:%dn",n); printf("*pFloat的值為:%fn",*pFloat); return 0; }
查德一看,輸出結果是: 9 、9.0、9、9.0
執行結果見下圖:
num 和 *pFloat 在記憶體中明明是同一個數,但是浮點數和整數的解讀結果會差別巨大,要理解這個結果,需要理解浮點數在計算機內部的表示方法。
根據國際標準IEEE(電氣和電子工程協會) 754,任意一個二進位制浮點數V可以表示成下面的形式:
舉例說明:
對於32位元的浮點數,最高的1位是符號位s,接著的8位元是指數E,剩下的23位為有效數位M
對於64位元的浮點數,最高的1位是符號位S,接著的11位是指數E,剩下的52位為有效數位M
E為一個無符號整數(unsigned int)
但是,科學計數法中的E是可以出現負數的,所以IEEE 754規定,存入記憶體時E的真實值必須再加上一個中間數:
1、E不全為0或不全為1
2、E全為0
3、E全為1
如果有效數位M全為0,表示±無窮大(正負取決於符號位s)
int main() { float f = 5.5; //浮點數 101.1 二進位制表示 (-1)^0 * 1.011* 2^2 IEEE 745規定 s=0 //代表正數 E=2 //代表指數,左移2位 ,儲存是時要+127 =129 M=1.011 //有效數位 0 10000001 01100000000000000000000 0100 0000 1011 0000 0000 0000 0000 0000 0x40 b0 00 00 小端儲存 }
由上面分析可知,浮點數5.5在記憶體的儲存形式見下圖:
偵錯程式發現結果與分析過程一致,並且是小端儲存。
int main() { float f = 0.5; 浮點數 0.1 二進位制表示 (-1)^0 * 1.0*2^-1 IEEE 745規定 S = 0 代表正數 M = 1.0 有效數位 E = -1 代表指數,右移1位 ,儲存是要+127 =126 0 01111110 00000000000000000000000 0011 1111 0000 0000 0000 0000 0000 0000 0x3f 00 00 00 return 0; }
由上面分析可知,浮點數0.5在記憶體的儲存形式見下圖:
偵錯程式發現結果與分析過程一致,並且是小端儲存。
下面對 3.1的例子進行講解:
int main()
{
int n = 9;
第一步:正數9在記憶體儲存的形式:
00000000000000000000000000001001
float *pFloat = (float*)&n;
第二步:將正數強制轉換位浮點型,認為pfloat指向的內容是浮點數
儲存在記憶體中的形式
0 00000000 00000000000000000001001
0000 0000 0000 0000 0000 1001
0x00 00 00 09
s=0
E= -126 因為E是全為0的特殊情況,取出就是1-127固定的
M= 0.00000000000000000001001 後面23位都是小數位
第三步:從記憶體中取出浮點數
(-1)^0 * 0.00000000000000000001001 * 2^-126
結果為極限接近0的非常小的數
printf("n的值為:%dn",n); 輸出9
printf("*pFloat的值為:%fn",*pFloat);輸出浮點數0.00000
*pFloat = 9.0;
第一步:浮點數9.0的二進位制形式:
1001.0
(-1)^0 * 1.001 * 2^3
s=0
E=3 代表指數,左移3位 ,儲存是要+127 =130
M=1.001
第二步:浮點數9.0在記憶體儲存的形式:
0 10000010 00100000000000000000000
0100 0001 0001 0000 0000 0000 0000
0x41 10 00 00
第三步:%d列印,上面的二補數就是正數的二補數了,三碼合一
列印原碼: 1,091,567,616
printf("num的值為:%dn",n);
printf("*pFloat的值為:%fn",*pFloat); 9.0
return 0;
}
此時再看結果,就會一目瞭然了:
- 輸出浮點數0.00000,浮點數在記憶體的儲存形式 0x00 00 00 09,小端儲存形式:
輸出正數1,091,567,616,正數數在記憶體的儲存形式 0x41 10 00 00,小端儲存形式:
輸出結果與分析一致:
兩個浮點數不能直接判斷是否相等,應該判斷他們之間的差值是否在一個給定範圍內,滿足自己的使用要求即可。
int main() { int a = 0; if (a == 1)//整數可以直接判斷 { } float b = 0.00001;//基本接近0,但不是0 if (b==0.0)//不能這樣判斷,會出問題 { } }
資料的儲存相關內容是C語言進階階段的第一個知識點,與整形提升關係密切,還要熟悉變數型別、符號位、型別範圍、原碼反碼二補數、等等,這部分內容更多的牢記變數儲存型別的性質,不能想當然的去考慮結果,每一步的思考都要有依據才行。
要溫故而知新,通過這部分的學習,給自己在以後的程式找錯中,提供了不一樣的思路。
下一篇開始學習指標進階的內容了。(連結直達)
到此這篇關於C語言資料的儲存超詳細講解下篇浮點型在記憶體中的存取的文章就介紹到這了,更多相關C語言 浮點型資料的儲存 內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45