【C语言】浮点型在内存的存储
文章目錄
- 一、浮點數存儲規則
- 1.常見的浮點數
- 2.存儲規則
- 例子
- 二、練習題
- 1.思考題
- 2.程序題
一、浮點數存儲規則
1.常見的浮點數
3.14159——普通
1E10——科學計數法形式
2.存儲規則
根據IEEE754標準,任意一個二進制浮點數V可以表示成下邊的形式:
(-1)^S*M*2^E
其中(-1)^S 表示符號位,S取1為負數,S取0位正數
M表示有效數字,大于等于1,小于2【由于二進制的原因,所以1<=M<2】
2^E表示指數位【計算機二進制存儲模式,E是次方】
IEEE 754****規定:
對于32位的浮點數,最高的1位是符號位s,接著的8位是指數E,剩下的23位為有效數字M。——32=23+8+1
對于64位的浮點數,最高的1位是符號位S,接著的11位是指數E,剩下的52位為有效數字M。——64=52+11+1
·由于M取值范圍很小,所以存儲時會將整數部分1和小數點.,在取出數據的時候再將他們添上,提升存儲效率。
對于E需要注意兩點——
①類型為無符號整數
如果E為8位,它的取值范圍為0255;如果E為11位,它的取值范圍為02047
所以IEEE 754規定,存入內存時E的真實值必須再加上一個中間數,對于8位的E,這個中間數是127;對于11位的E,這個中間數是1023【并且以二進制形式存,這里就不需要考慮原反補什么了(但其實正數也不需要考慮這些計算,都是一毛一樣的)】
比如說2^10的E是10,所以保存成32位浮點數時,必須保存成10+127=137
也就是27+23+2^0即1000 1001
②E是否全為0是否全為1
E不全為0或不全為1——正常值
E全為0——無窮小
E全為1——無窮大
OK,讓我們來再來想一遍浮點數的存儲規則到底是什么?
首先,浮點數表示規則為指數E的計算值減去127/1023得到,得到真實值,有效數字M前加上1.,S為0為正數,為1位負數;
其次,float型1個是符號位,8個是指數位,23個是有效位;double型1個符號位,11個指數位,52個有效位;
再然后,E全為0表示無窮小,全為1表示無窮大,E還是一個無符號整數,儲存的時候還需要加上中間值127/1023【助記128(2的7次方)、1024(2的10次方)】
**最后,在此重申——表示形式為(-1)*S*M*2^E**
例子
1)5.0f----->101.0------->1.01*2^2
2)9.5f----->1001.1f----->1.0011*23【這里特別注意權重的問題,小數點一直向左權重分別為20,21,22……,小數點一直向右權重分別為2-1,2-2,2^-3……】
3)9.6f----->1001.100……不能準確渠道
二、練習題
1.思考題
為什么無法精確保存分數的值?
浮點數的儲存時的有效數字為是有限的,能夠保存的位數總是有限的,所以無法精確保存。
2.程序題
int main() {int n = 9;float *pFloat = (float *)&n;printf("n的值為:%d\n",n);printf("*pFloat的值為:%f\n",*pFloat);*pFloat = 9.0;printf("num的值為:%d\n",n);printf("*pFloat的值為:%f\n",*pFloat);return 0; }總結
以上是生活随笔為你收集整理的【C语言】浮点型在内存的存储的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 科大星云诗社动态20210130
- 下一篇: 【火影忍者】荏苒间,指针又在十字路口【转