<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;//將整型9儲存到n中 float* pFloat = (float*)&n; printf("n的值為:%dn", n); printf("*pFloat的值為:%fn", *pFloat); *pFloat = 9.0;//將浮點型9.0儲存到*pFloat中 printf("num的值為:%dn", n); printf("*pFloat的值為:%fn", *pFloat); return 0; }
從程式碼中我們可以看到,n和*pFloat指向的其實是同一塊區域,因為int和float都是4個位元組的資料型別。讓我們來看看最後的輸出結果:
我們可以看到結果還是有些出人意料——
以整形儲存(n = 9),可以用整型正常讀取,但用浮點型讀取就會出現難以預料的情況 ;
同樣的,以浮點型儲存(*pFloat = 9.0),可以用浮點型正常讀取,但是用整型就會出現難以預料的情況。
從這個例子中我們可以知道,浮點型和整型的儲存和讀取方式是完全不同的。
從前面的部落格中,我們瞭解到了整型是通過二補數的形式儲存的,那麼浮點型的儲存形式是什麼樣的呢?
實際上,根據國際標準IEEE(電氣和電子工程協會) 754,任意一個二進位制浮點數可以表示成下面的形式:
(-1)^S * M * 2^E
S是符號位(為0時浮點數為正,為1時浮點數為負),M為有效數位(大於1小於2),2^E表示指數位(決定了這個數的大小)。
讓我們來舉例說明:
浮點數8.5f轉換成二進位制為1000.1,S為0,M為1.0001,E為 3
=(-1)^0 * 1.0001 * 2^3
所以我們只要在記憶體中儲存S、M和E三個數位就可以儲存浮點型資料了,實際上也是那麼操作的。
接下來我們用圖來解釋內部的儲存邏輯:
IEEE 754規定,在計算機內部儲存M時,預設這個數的第一位總是1,因此可以被捨去,只儲存後面的xxxxxx部分。比如儲存1.01的時候,只儲存01,等到讀取的時候,再把第一位的1加上去。這樣做的目的,是節省1位有效數位。以32位元浮點數為例,留給M只有23位,將第一位的1捨去以後,等於可以儲存24位元有效數位。
我們要知道,E是一個無符號整型數位,這意味著,如果E為8位元,它的取值範圍為0~255;如果E為11位,它的取值範圍為0~2047。
但是,我們知道,科學計數法中的E是可以出現負數的,所以IEEE 754規定,存入記憶體時E的真實值必須再加上一個中間數,對於8位元的E,這個中間數是127;對於11位的E,這個中間數是1023。比如,2^10的E是10,所以儲存成32位元浮點數時,必須儲存成10+127=137,即10001001。
然後,指數E從記憶體中取出還可以再分成三種情況:
這時,浮點數就採用下面的規則表示,即指數E的計算值減去127(或1023),得到真實值,再將
有效數位M前加上第一位的1。
以8.5f為例
#include<stdio.h> // 8.5f // S為0,M為1.0001,E為 3 + 127 // 0 10000010 00010000000000000000000 // S E M // 0100 0001 0000 1000 0000 0000 0000 0000 // 轉換為16進位製為41 08 00 00 // int main() { float a = 8.5f; return 0; }
因為是小端儲存,記憶體中儲存的內容與推斷一致。
這時,浮點數的指數E等於1-127(或者1-1023)即為真實值,有效數位M不再加上第一位的1,而是還原為0.xxxxxx的小數。這樣做是為了表示±0,以及接近於0的很小的數位。
這時,如果有效數位M全為0,表示±無窮大(正負取決於符號位s)。
int main() { int n = 1;//E全為0 float* pFloat = (float*)&n; printf("*pFloat的值為:%.100fn", *pFloat); n = -1;//E全為1 printf("*pFloat的值為:%.100fn", *pFloat); return 0; }
到此這篇關於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