C/C++數據存儲之float和double在內存中的存儲方式

float和double在內存中的存儲方式

說來慚愧,工作那麼多年,對於float和double浮點數在內存中的存儲方式一直迷迷糊糊,今日閒暇,乾脆一口氣將之前模糊不清的地方
一次性掃蕩掉

float數據類型在內存中的存儲

無論是單精度還是雙精度,在內存存儲中都分爲3個部分:
1 符號位(Sign):0代表正,1代表爲負;
2 指數位(Exponent):用於存儲科學計數法中的指數數據,並且採用移位存儲;
3 尾數部分(Mantissa):尾數部分

以下爲float型數據在內存中的存儲方式
在這裏插入圖片描述

打開VS2017,寫個程序打斷點分析一下

#include "pch.h"
#include <iostream>
int main()
{
    std::cout << "Hello World!\n"; 
       float t = 19.133;
       uint32_t* p = (uint32_t*)&t;
       uint32_t r = *p;
}

通過r值可知,數據在內存中存放的值爲十六進制數0x41991062,展開32位float二進制分析:
0 10000011 00110010001000001100010

符號位:0 爲正
指數位:10000011 十進制爲131,根據IEEE規定,減去127方爲真正的指數,故指數爲4
底數位:001 1001 0001 0000 0110 0010
底數爲:1.0011001000100000110001
該浮點數表示爲 1.0011001000100000110001*10000

10011.001000100000110001
19+1/23+1/27+1/213+1/214+1/2^18 = 19.132999420166

double數據類型在內存中的存儲

我們依然使用19.133爲例來研究double中對該數據的存儲方式,並類比float,從而明白爲什麼double比float型精度更高
在這裏插入圖片描述
十六進制:0x4033220C49BA5E35
二進制:‭0100000000110011001000100000110001001001101110100101111000110101‬

符號位:‭0
指數位:10000000011
底數位: 0011001000100000110001001001101110100101111000110101
底數爲:1.0011001000100000110001001001101110100101111000110101
該浮點數表示爲 1.0011001000100000110001001001101110100101111000110101*10000

10011.001000100000110001001001101110100101111000110101
19+1/23+1/27+1/213+1/214+1/2^18 + …

總結

同樣對float和double類型的數據賦值,從存儲上可以看出double的精度比float更高。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章