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更高。