C語言之數據在內存中的存儲(2),浮點數在內存中的存儲


目錄

前言

一、引例

二、浮點型在內存中的存儲

三、浮點數在內存中的存和取過程

1.浮點數的存儲過程

2.浮點數的取過程

四、引例解析

總結



前言

? ? ? ? 想知道浮點數在內存中是如何存儲的嗎,本文就告訴你答案,雖然一般情況題目還是面試涉及到浮點數在內存中的存儲很少,但是了解其存儲機制有利于加深我們對C語言的理解,修煉我們的內功。


??感謝支持,點贊關注不迷路??


?

?

一、引例

我們看以下代碼:

#include <stdio.h>int main()
{int n = 9;float* pFloat = (float*)&n;printf("n的值為:%d\n", n);printf("pFloat的值為:%f\n", *pFloat);*pFloat = 9.0;printf("n的值為:%d\n", n);printf("pFloat的值為:%f\n", *pFloat);return 0;
}

運行結果:

發現:我們觀察到,將整數9以浮點型打印時為0.000000,將浮點型9.0以整形打印時是一個較大的數字。這一點就可以說明整形與浮點型在內存中的存儲形式是不同的。


二、浮點型在內存中的存儲

我們知道整數在內存中是以補碼的形式儲存的,那么浮點數是怎么存儲的呢?

根據國際標準IEEE(電氣和電子工程協會)754,任意一個?進制浮點數V可以表示成下面的形式:

舉例:浮點數5.5用以上形式如何表示:

  1. 首先5.5翻譯成二進制為 101.1。
  2. 然后就可以改寫成以下形式:
  3. 這時候,M就是1.011,E就是2,S自然為0


然后,只需要將S、M、E這三個數存儲到內存中,就可以儲存一個浮點數了,那么這三個數是如何在內存中存放的呢?

IEEE 754規定:

  • 對于32位的浮點數(float),最?的1位存儲符號位S,接著的8位存儲指數E,剩下的23位存儲有效數
  • 字M 對于64位的浮點數(double),最?的1位存儲符號位S,接著的11位存儲指數E,剩下的52位存儲有效數字M

注意:不管怎樣,內存中存儲的還是補碼


??

三、浮點數在內存中的存和取過程

1.浮點數的存儲過程

IEEE 754對有效數字M和指數E,還有一些特別規定。

M的存儲過程:前面用101.1舉例,可以寫成類似科學計數法的形式。1<=M<2,也就是說,M可以寫成 1.xxxxxx 的形式,其中 xxxxxx 表表示小數部分。那么就有以下規定:

IEEE 754規定,在計算機內部保存M時,默認這個數的第?位總是1,因此可以被舍去,只保存后面的 xxxxxx部分。比如保存1.01的時候,只保存01,等到讀取的時候,再把第一位的1加上去。這樣做的目的,是節省1位有效數字。以32位浮點數為例,留給M只有23位,將第?位的1舍去以后,等于可以保存24位有效數字。

E的存儲過程:指數E,情況就比較復雜首先,E為一個無符號整數(unsigned int),這意味著,如果E為8位,它的取值范圍為0~255;如果E為11位,它的取值范圍為0~2047。但是,我們知道,科學計數法中的E是可以出現負數的。E又是無符號整數,所以規定:

IEEE754規定,存入內存時E的真實值必須再加上一個中間數,對于8位的E,這個中間數是127;對于11位的E,這個中間數是1023。比如,2^10的E是 10,所以保存成32位浮點數時,必須保存成10+127=137,即10001001。

舉例:浮點數(float)5.5,二進制位:101,1

  1. S:0,E:2,M:001
  2. 但是E存入內存時(float)要加上127等于129
  3. 結果就是 0 10000001 01100000000000000000000
  4. 注意:M后不夠是補0的
  5. 0100 0000 1011 0000 0000 0000 0000 0000翻譯為16進制為0x40 b0 00 00
  6. 然后我們在VS中調試觀察,驗證以下
  7. 因為VS是小端存儲,所以是倒著存,結果一致


2.浮點數的取過程

這里主要是指數E從內存中取出還可以再分成三種情況:

1.E不全為0或不全為1(和上面舉例一樣,正常取)

這時,浮點數就采用下面的規則表示,即指數E的計算值減去127(或1023),得到真實值,再將有效數字M前加上第一位的1。

比如:0.5的二進制形式為0.1,由于規定正數部分必須為1,即將小數點右移1位,則為1.0*2^(-1),其階碼為-1+127(中間值)=126,表示為01111110,而尾數1.0去掉整數部分為0,補齊0到23位 00000000000000000000000,則其二進制表示形式為:

0 01111110 00000000000000000000

2.E全為0(特殊情況)

這時,浮點數的指數 E?等于1-127(或者1-1023)即為真實值,有效數字M不再加上第一位的1,而是還原為0.xxxxxx的小數。這樣做是為了表示±0,以及接近于0的很小的數字。

比如1.0*2的負127次方,這個數無限接近于0,所以M讀取時不再加上1,并且指數讀取時是減126而不是127,因為M的整數位1被移到了小數部位,所以內存中為0 00000000 00000000000000000000000,讀取時就是0.000000

3.E全為1(特殊情況)

這時,浮點數指數 E 等于128,如果有效數字M全為0,表示±無窮大(正負取決于符號位s);

我們可以簡單算一下,2的32次方大約42億,那么4個42移相乘,那數字將會非常大。


四、引例解析

引例中的結果:

我們來一步一步分析:

  1. 首先 int n = 9,它在內存中的補碼為:00000000 00000000 00000000 00001001。以%d打印肯定是9沒毛病。
  2. 然后通過指針把它當做浮點型打印,這時編譯器就會將n的補碼以浮點數的格式進行讀取,float為32個比特位,可以寫成0 00000000 00000000000000000001001。
  3. 這里 E 的部分全為0,對應了上文第二種情況,E將無限接近于0,讀取出來就是,0.9*2的負126次方,等于0.00000...9,而編譯器默認打印小數點后6位,因此結果才為0.000000
  4. 通過指針將n的空間存的值修改為9.0,而9.0將會以32位浮點型的格式存儲到內存中,9.0翻譯為二進制為:1001.0,變為科學計數法為:1.001*2^3,那么S:0,E:3,M:1.001
  5. E存入內存要加上127等于130,二進制為:10000010,因此9.0存入內存的二進制為:0 10000010 00100000000000000000000
  6. 將?01000001000100000000000000000000以整形的格式讀取時就為:
  7. 以浮點型%f讀取就是正常9.0

所以我們在拿到一個數據時,非特殊一定要以正確的格式讀取,否則就不是你想要的數字


總結

? ? ? ? 以上就是本文的全部內容,希望對你有所幫助。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/45035.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/45035.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/45035.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

新華三H3CNE網絡工程師認證—ACL使用場景

ACL主要用于實現流量的過濾&#xff0c;業務中網絡的需求不止局限于能夠連同。 一、過略工具 你的公司當中有研發部門&#xff0c;包括有財務部門&#xff0c;財務部門的訪問是要做到控制的&#xff0c;防止被攻擊。 這種的過濾方法為&#xff0c;在設備側可以基于訪問需求來…

解決IntelliJ IDEA連接MySQL時“Public Key Retrieval is not Allowed”問題

前言 在使用IntelliJ IDEA開發環境中連接MySQL數據庫時&#xff0c;可能會遇到“Public Key Retrieval is not allowed”這樣的錯誤提示&#xff0c;即使輸入的用戶名和密碼完全正確。本文將指導你如何解決這一問題&#xff0c;確保順利建立數據庫連接。 錯誤背景 這一問題通…

AI算力發展現狀與趨勢分析

綜合算力發展現狀與趨勢分析 在數字經濟的疾速推動下&#xff0c;綜合算力作為驅動各類應用和服務的新型生產力&#xff0c;其價值日益凸顯。我們深入探討了綜合算力的定義、重要性以及當前發展狀況&#xff1b;并從算力形態、運力性能和存儲技術等角度&#xff0c;預見了其發展…

基于Java技術的校友社交系統

你好呀&#xff0c;我是計算機學姐碼農小野&#xff01;如果你對校友社交系統感興趣或者有相關需求&#xff0c;可以私信聯系我。 開發語言 Java 數據庫 MySQL 技術 Java技術SpringBoot框架 工具 IDEA/Eclipse、Navicat、Maven 系統展示 首頁 校友會信息界面 校友活動…

Sqli-labs 3

1.按照路徑http://localhost/sqli-labs/sqli-labs-master/Less-3/進入 2.判斷注入類型----字符型 Payload&#xff1a;?id1’) and 11-- 注&#xff1a;根據報錯提示的語法錯誤&#xff0c;在第一行中使用接近’union select 1,2,3--’)的正確語法 3.判斷注入點&#xff1a;…

【Linux】vim詳解

1.什么是vi/vim? 簡單來說&#xff0c;vi是老式的文本編輯器&#xff0c;不過功能已經很齊全了&#xff0c;但是還是有可以進步的地方。vim則可以說是程序開發者的一項很好用的工具&#xff0c;就連 vim的官方網站&#xff08; http://www.vim.org&#xff09;自己也說vim是一…

如何計算卷積層輸出圖像的大小以及池化大小輸出

如何計算卷積層輸出圖像的大小&以及池化大小輸出 卷積 在卷積神經網絡&#xff08;CNN&#xff09;中&#xff0c;計算卷積層輸出圖像的大小是一個常見的操作。以下是卷積計算的基本公式和步驟&#xff1a; 卷積層輸出尺寸計算公式&#xff1a; Output_size ? Input_s…

區塊鏈項目全球成功指南:全面覆蓋的媒體宣發策略與實踐

隨著區塊鏈技術的迅速普及和發展&#xff0c;全球范圍內對區塊鏈項目的關注度不斷提升。為了在國際市場上取得成功&#xff0c;區塊鏈項目需要通過有效的媒體宣傳策略來提高知名度&#xff0c;吸引投資&#xff0c;并建立強大的社區支持。本文將詳細介紹區塊鏈項目在海外媒體宣…

為企業提升銷售工作效率的工作手機管理系統

在競爭日益激烈的市場環境中&#xff0c;企業的銷售團隊如同前線戰士&#xff0c;其作戰效率直接關乎企業的生存與發展。然而&#xff0c;傳統銷售管理模式下的信息孤島、溝通不暢、數據混亂等問題&#xff0c;正悄然成為制約銷售效率提升的瓶頸。今天&#xff0c;我們為您揭秘…

在 Windows 平臺搭建 MQTT 服務

引言 MQTT 是一種輕量級、基于發布/訂閱模式的消息傳輸協議&#xff0c;旨在用極小的代碼空間和網絡帶寬為物聯網設備提供簡單、可靠的消息傳遞服務。MQTT 經過多年的發展&#xff0c;如今已被廣泛應用于資源開采、工業制造、移動通信、智能汽車等各行各業&#xff0c;使得 MQ…

匯聚榮做拼多多電商怎么樣?

匯聚榮做拼多多電商怎么樣?在當前電商平臺競爭激烈的背景下&#xff0c;拼多多憑借其獨特的商業模式和市場定位迅速崛起。對于想要加入拼多多的商家而言&#xff0c;了解平臺的特點、優勢及挑戰是至關重要的。本文將深入分析加入拼多多電商的多個方面&#xff0c;幫助讀者全面…

ubuntu計劃任務反彈

目錄 實驗環境 實驗步驟 目標主機構造任務計劃 構造語句 語句解釋 kali開啟監聽 監聽成功 問題 原因 實驗環境 攻擊者 操作系統&#xff1a;kali IP&#xff1a;192.168.244.141 目標主機 操作系統&#xff1a;ubuntu IP&#xff1a;192.168.244.151 實驗步驟 目…

論文學習_An Empirical Study of Deep Learning Models for Vulnerability Detection

1. 引言 研究背景:近年來,深度學習漏洞檢測工具取得了可喜的成果。最先進的模型報告了 0.9 的 F1 分數,并且優于靜態分析器。結果令人興奮,因為深度學習可能會給軟件保障帶來革命性的變化。因此,IBM、谷歌和亞馬遜等行業公司非常感興趣,并投入巨資開發此類工具和數據集。…

(8)揭示Python編程精髓:深潛繼承與多態的奇幻之旅

目錄 1. 命名空間與作用域1.1 命名空間概述1.2 作用域1.2.1 局部作用域1.2.2 全局作用域1.2.3 修改全局變量1.2.4 嵌套作用域 2. 繼承3. 多態&#xff08;Polymorphism&#xff09; 1. 命名空間與作用域 1.1 命名空間概述 命名空間是一個從名字到對象的映射&#xff0c;它在P…

Qt:19.浮動窗口/子窗口(子窗口介紹、代碼方式創建子窗口、設置子窗口標題、為子窗口添加控件、設置子窗口停靠位置)

目錄 1.子窗口介紹&#xff1a; 2.代碼方式創建子窗口&#xff1a; 3.設置子窗口標題&#xff1a; 4.為子窗口添加控件&#xff1a; 5.設置子窗口停靠位置。 1.子窗口介紹&#xff1a; 在 Qt 中&#xff0c;可以創建和管理子窗口&#xff08;子窗口體&#xff09;以實現多窗…

圖片怎么制作成長期可用的活碼?掃碼提供圖片預覽的制作技巧

現在圖片的尺寸和清晰度的質量越來越高&#xff0c;相對應的會占用更多的存儲空間&#xff0c;現在很多人會將圖片存入云端后&#xff0c;通過生成二維碼的方式&#xff0c;掃碼來查看圖片內容。圖片轉換二維碼有利于將圖片分享給其他人查看&#xff0c;還能夠節省更多的空間&a…

SpringBoot自己開發一個starter

提示&#xff1a;本文主要講述如何自行開發一個SpringBoot的starter 文章目錄 目錄 文章目錄 前言 一、Starter是什么 二、創建一個SpringBoot項目 1.創建一個基本的SpringBoot項目 2.選擇要下載的庫 三、設置項目 1.提示 2.配置pom.xml 3.重點代碼 1.創建一個User類…

16.x86游戲實戰-匯編指令push pop pushad popad

免責聲明&#xff1a;內容僅供學習參考&#xff0c;請合法利用知識&#xff0c;禁止進行違法犯罪活動&#xff01; 本次游戲沒法給 內容參考于&#xff1a;微塵網絡安全 工具下載&#xff1a; 鏈接&#xff1a;https://pan.baidu.com/s/1rEEJnt85npn7N38Ai0_F2Q?pwd6tw3 提…

【第29章】MyBatis-Plus之分頁插件

文章目錄 前言一、支持的數據庫二、配置方法三、屬性介紹四、自定義 Mapper 方法中使用分頁五、其他注意事項六、Page 類七、實戰1. 配置類2. 分頁類3. 測試 總結 前言 MyBatis-Plus 的分頁插件 PaginationInnerInterceptor 提供了強大的分頁功能&#xff0c;支持多種數據庫&a…

Windows電腦安裝Python結合內網穿透輕松搭建可公網訪問私有網盤

文章目錄 前言1.本地文件服務器搭建1.1.Python的安裝和設置1.2.cpolar的安裝和注冊 2.本地文件服務器的發布2.1.Cpolar云端設置2.2.Cpolar本地設置 3.公網訪問測試4.結語 前言 本文主要介紹如何在Windows系統電腦上使用python這樣的簡單程序語言&#xff0c;在自己的電腦上搭建…