日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學無先后,達者為師

網站首頁 編程語言 正文

C語言詳細圖解浮點型數據的存儲實現_C 語言

作者:利刃Cc ? 更新時間: 2022-06-30 編程語言

在引入知識之前,先來看一個案例,就知道了解浮點型數據存儲的重要性與必要性。

舉個例子:

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main()
{
	int num = 9;
	float *pnum = (float *)&num;//強制轉換類型
	printf("n的值為:%d\n",n);
	printf("*pFloat的值為:%f\n",*pnum);
	*pnum = 9.0;
	printf("num的值為:%d\n",n);
	printf("*pFloat的值為:%f\n",*pnum);
	return 0;
}

一般情況下我們都會認為*pnum打印的就是n的值,只不過是以浮點型打印出來,所以是9.000000啊,然后下面的n又因為*pnum的修改,加之因為%d輸出,所以還是9啊,但是結果不是,打印出來的結果如下圖所示:

結果與我們想的有很大的偏差。。。。。那就有必要讓我們來了解浮點型數據的存儲啦!

1.首先,根據上面的實例,我們可以發現整型和浮點型數據的存儲方法是不一樣的!

2.那么浮點型數據是怎么存儲的呢?

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

## (-1)^S * M * 2^E

## (-1)^S 表示符號位,當S=0時,V為正數;當S=1時,V為負數。

## M 表示有效數字,且1<=M<2

## 2^E表示指數位

舉例來說:十進制的 5.0,寫成二進制是 101.0,相當于 1.01 *2^2 。那么,按照上面的V的格式,可以得出S=0,M=1.01,E=2。

十進制的 -5.0,寫成二進制是 -101.0 ,相當于 -1.01 * 2^2 。那么,S=1,M=1.01,E=2。

IEEE 754規定對于任意一個浮點數V都可以表示成V=(-1)^s * M *2^E,那我們是不是只要知道S、M、E三個值就可以確定一個浮點數?事實上,c語言內存存儲浮點數時,也確實是只存儲S、和指數E有關的一個值、和M有關的一個值(注意,這里不是直接存E、M) 詳情如下:

相對應的float型是32位的,它的存儲空間如下:

相對應的double型是64位的,它的存儲空間如下:

對于M與E的特別規定:

E的使用:

所以我們再對剛才的代碼加以解釋:

1.首先我們先把n的補碼寫出來,因為n是正數,所以它的原反補相同。

2.按照上面的方法,把n的補碼分解后發現它的E為全0,所以相當于一個無窮小的數字,所以此時*p為0.000000……

3.將*p改成9.0后按照上面的方法,先改成二進制 1001.1,然后寫成 (-1)^0 * 1.001 * 2^3,最后按照格式變成補碼,存到內存中去,此時補碼為01000001000100000000000000000000,而n為整型數據,所以先取出這個補碼,又因為其為正數,所以直接將補碼轉為十進制%d輸出:

結果與我們之前執行的結果一致!

浮點型數據存儲是很重要的知識點,它也加強了我們對數據存儲的了解!

原文鏈接:https://blog.csdn.net/lirendada/article/details/122856142

欄目分類
最近更新