網站首頁 編程語言 正文
在引入知識之前,先來看一個案例,就知道了解浮點型數據存儲的重要性與必要性。
舉個例子:
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main()
{
int num = 9;
float *pnum = (float *)#//強制轉換類型
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
相關推薦
- 2022-04-29 Go語言中的并發goroutine底層原理_Golang
- 2022-08-21 Mac包管理器Homebrew的安裝方法_其它綜合
- 2022-08-25 R語言多元線性回歸實例詳解_R語言
- 2023-10-11 在MyBatisPlus中添加分頁插件
- 2022-07-04 C#字符串String及字符Char的相關方法_C#教程
- 2022-04-14 Python中五種列表拷貝的方法_python
- 2022-05-26 Python入門必讀的if語句嵌套方法_python
- 2022-02-15 Linux系統設置tomcat開機自啟介紹_Linux
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支