最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C語言浮點型數(shù)據(jù)在內存中的存儲方式詳解

 更新時間:2023年03月30日 11:40:33   作者:CGod  
任何數(shù)據(jù)在內存中都是以二進制的形式存儲的,例如一個short型數(shù)據(jù)1156,其二進制表示形式為00000100 10000100,下面這篇文章主要給大家介紹了關于C語言浮點型數(shù)據(jù)在內存中的存儲方式,需要的朋友可以參考下

前言

深刻了解浮點型數(shù)據(jù)在內存中的存儲方式,是在修煉內功,讓后續(xù)的學習更深刻,更容易發(fā)現(xiàn)編程過程中的問題并解決問題,繼續(xù)帶鐵汁們學一波干貨~沖!

一、思考一下

咱們先上一盤開胃菜,試試看叭

#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("num的值為:%d\n", n);
	printf("*pFloat的值為:%f\n", *pFloat);	
	return 0;
}

路飛:請問打印出來都是什么結果呢?貝吉塔:簡單,喏

路飛:哈哈~雖然很符合直觀想法,但是錯啦錯啦,喏

貝吉塔:蛤??!這么奇怪的結果

二、浮點數(shù)存儲規(guī)則

既然上述結果跟我們所理解的整型數(shù)據(jù)存儲方式的結果不同,這就說明浮點型數(shù)據(jù)在內存中的存儲方式是不一樣滴~

2.1 浮點數(shù)表示方法的規(guī)定

詳細解讀:

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

  • (-1)^S * M * 2^E
  • (-1)^S表示符號位。當S=0,V為正數(shù);當S=1,V為負數(shù)
  • M表示有效數(shù)字,大于等于1,小于2
  • 2^E表示指數(shù)位

舉例來說:

十進制的5.5,寫成二進制是101.1,相當于(1)^0 * 1.011 * 2^2,此時

aiphabetValue
S0
M1.011
E2

此時會有鐵汁有疑問,為什么5.5的二進制是101.1??不應該是101.101嗎?

我們看看下圖,假如是101.101,那么轉換成十進制就是5.625,因為二進制每一位的權重都不同,不能想當然

假如說給的十進制是5.3,那么這個0.3是不能精確表示的,所以說浮點數(shù)容易丟失精度

2.2 浮點數(shù)的存儲

2.2.1 IEEE 754規(guī)定

對于32位的浮點數(shù)(float),最高的1位是符號位S,接著的8位是指數(shù)E,剩下的23位是有效數(shù)字M

對于64位的浮點數(shù)(double),最高的1位是符號位S,接著的11位是指數(shù)E,剩下的52位是有效數(shù)字M

2.2.2 IEEE 754對有效數(shù)字M,還有一些特別規(guī)定

前面說過,1≤M<2,也就是說,M可以攜程1.xxxxxx的形式。其中xxxxxx表示小數(shù)部分

IEEE 754規(guī)定,在計算機內部保存M時,默認這個數(shù)的第一位總是1,因此可以被舍去,只保存后面的xxxxxx。比如保存1.01時,只保存01,等到讀取的時候再放回去,這樣做的目的是節(jié)省空間

2.2.3 IEEE 754對指數(shù)E,還有一些特別規(guī)定

  1. 首先,E為一個無符號整數(shù)(unsigned int),這意味著,如果E為8位,它的取值范圍為0-255;如果E為11位,它的取值范圍為0-2047。
  2. 但是我們知道,科學計數(shù)法中的E是可以出現(xiàn)負數(shù)的,所以IEEE 754規(guī)定,存入內存時E的真實值必須再加上一個中間數(shù)
  3. 對于8位的E,中間數(shù)取127;對于11位的E,中間數(shù)取1023。
  4. 比如2^10的E是10,所以保存成32位浮點數(shù)時,必須保存成10+127=137,即為10001001

2.2.4 實操一下看看是怎樣存儲的

int main()
{
	float f = 5.5f;
	//(-1)^0 * 1.011 * 2^2
	//S = 0
	//M = 1.011
	//E = 2
	//這樣存: 0 10000001 01100000000000000000000
	//也就是: 0100 0000 1011 0000 0000 0000 0000 0000
	//十六進制表示: 40 b0 00 00
	return 0;
}

5.5float存儲,如圖所示

轉換成十六進制就是40 b0 00 00,咱們調試看看叭~因為VS是小端字節(jié)序存儲,所以地址由低到高看到的是00 00 b0 40

2.3 浮點數(shù)從內存中取出

2.3.1指數(shù)E從內存中取出分三種情況

SM的取出很簡單,原樣返回,但是E我就得仔細談談了

  • E不全為0或不全為1:

這時,把E減去之前加上去的127(或1023),得到真實值,再講有效數(shù)字M前加上第一位的1,這種情況最簡單,逆著來就是了

  • E為全0:

這時真實的E為-127(或-1023),太小了,所以規(guī)定浮點數(shù)的指數(shù)E等于1-127(或1-1023)即為真實值,有效數(shù)字M不再加上第一位的1,而是還原為0.xxxxxx的小數(shù)。這樣做是為了表示±0,以及接近于0的很小的數(shù)字(這是規(guī)定,大家不要糾結)

  • E為全1:

這時真實的E128,太大了,如果有效數(shù)字M全為0,表示±無窮大(正負取決于符號位S)

2.3.2 實操一下看看是怎樣取出的

我們回到最開始的代碼,看看能不能解決啦

#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("num的值為:%d\n", n);
	printf("*pFloat的值為:%f\n", *pFloat);	
	return 0;
}

答案:

  • 先分析前兩個輸出:

首先,9int類型的,存儲按整型存儲規(guī)則,就是在內存中都是以補碼形式存放的,而正數(shù)的原碼、反碼、補碼都一樣

int9
原碼00000000000000000000000000001001
反碼00000000000000000000000000001001
補碼00000000000000000000000000001001

2.第一個輸出是以%d(十進制整型)輸出,所以輸出結果確實是9

3. 第二個輸出,pFloat指針認為數(shù)據(jù)是以單精度浮點數(shù)類型存儲的,所以解應用的時候也是這么做的。此時pFloat發(fā)現(xiàn)E全為0,按照上述規(guī)則,9取出來就變成0.000000000000000000001001 * 2^-126,即使不管后面的指數(shù)!有效數(shù)字都已經非常小了!所以打印出來小數(shù)點后6位看到的是0.000000

然后,分析后兩個輸出:

首先,9.0float類型的,存儲按浮點數(shù)存儲規(guī)則,即為
(-1)^0 * 1.001 * 2^3

float9.0
S0
M1.001
E3

存到內存里就是:

于是第三個輸出,%d把它當整型輸出,那么在整型眼里,直接把這32位直接轉成十進制輸出了,就造成了輸出結果為1091567616

而第四個輸出就是按float類型輸出的,所以結果就是9.000000

三、總結

  • 內存可以認為都是一堆同樣的小格子
  • 但是整型和浮點型數(shù)據(jù)在內存中的存儲方式是不一樣的,哪怕都是一樣的內存格子,卻有各自的規(guī)則限制著(看起來都是放格子里沒有差別)
  • 所以輸出的時候,也有取出的規(guī)則,不然都一樣了

到此這篇關于C語言浮點型數(shù)據(jù)在內存中的存儲方式的文章就介紹到這了,更多相關C語言浮點型數(shù)據(jù)在內存的存儲內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • C++數(shù)據(jù)結構之堆詳解

    C++數(shù)據(jù)結構之堆詳解

    本文詳細講解了C++數(shù)據(jù)結構之堆,文中通過示例代碼介紹的非常詳細。對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-04-04
  • 貪心算法的C語言實現(xiàn)與運用詳解

    貪心算法的C語言實現(xiàn)與運用詳解

    這篇文章主要介紹了貪心算法的C語言實現(xiàn)與運用詳解,運用么,就是文中所附的ACM練習題,哈哈:D需要的朋友可以參考下
    2015-08-08
  • 一文詳解C++11中decltype的使用

    一文詳解C++11中decltype的使用

    這篇文章主要為大家分享了C++11中decltype關鍵字的使用示例,小編覺得內容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2023-07-07
  • C語言如何實現(xiàn)頭插法建立單鏈表

    C語言如何實現(xiàn)頭插法建立單鏈表

    這篇文章主要介紹了C語言實現(xiàn)頭插法建立單鏈表的方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-07-07
  • C語言實現(xiàn)簡單掃雷游戲

    C語言實現(xiàn)簡單掃雷游戲

    這篇文章主要為大家詳細介紹了C語言實現(xiàn)簡單掃雷游戲,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-02-02
  • C++中的Lambda函數(shù)詳解

    C++中的Lambda函數(shù)詳解

    大家好,本篇文章主要講的是C++中的Lambda函數(shù)詳解,感興趣的同學趕快來看一看吧,對你有幫助的話記得收藏一下,方便下次瀏覽
    2021-12-12
  • C/C++中抽象類詳解及其作用介紹

    C/C++中抽象類詳解及其作用介紹

    這篇文章主要介紹了C/C++中抽象類詳解及其作用,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-09-09
  • C/C++語言printf命令使用方法

    C/C++語言printf命令使用方法

    在本篇文章里小編給大家分享了關于C/C++語言printf命令使用方法和步驟,對此有需要的朋友們學習下。
    2019-01-01
  • C++雙向鏈表實現(xiàn)簡單通訊錄

    C++雙向鏈表實現(xiàn)簡單通訊錄

    這篇文章主要為大家詳細介紹了C++雙向鏈表實現(xiàn)簡單通訊錄,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-05-05
  • C++如何采用Daemon進行后臺程序的部署

    C++如何采用Daemon進行后臺程序的部署

    這篇文章主要介紹了C++采用Daemon進行后臺程序的部署,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-04-04

最新評論

屏东县| 五常市| 河源市| 泗洪县| 罗山县| 内黄县| 清镇市| 英德市| 辽阳县| 白银市| 德格县| 南涧| 松滋市| 大庆市| 嘉鱼县| 遂平县| 千阳县| 都匀市| 耿马| 赤壁市| 江城| 博兴县| 阿勒泰市| 宣城市| 洪泽县| 禄劝| 平潭县| 永川市| 嘉义市| 平阴县| 托里县| 渝北区| 旬阳县| 鹿泉市| 丁青县| 新沂市| 平潭县| 安塞县| 安顺市| 师宗县| 股票|