当前位置:网站首页>關於數據在內存中的存儲下
關於數據在內存中的存儲下
2022-06-25 13:10:00 【LIn_jt】
關於數據在內存中的存儲下
本文將講解浮點數在內存中存儲的相關知識
首先,先來看一下以下這個程序:>
在學習的時候, 我給出的答案是非常的單純的9 9.0 9 9.0,然而,當程序跑起來之後:>
要分析以上程序, 首先得了解浮點數在內存中的存儲。
對於二進制浮點數, 根據國際標准IEEE(電氣和電子工程協會) 754, 任意一個二進制浮點數V都能錶示為以下形式:>
*(-1) ^S * M 2 ^E
其中(-1)^S為符號比特,當s = 0 時,V為正數, 當浮點數s = 1 , V為負數.
M為有效比特, M>=1且M < 2
2 ^E次方錶示指數比特
舉個例子:>
例如十進制浮點數 5.5,我們將其轉換為二進制就為:>
101.1 //這裏是 .1的原因是此處1的權重是2 ^-1次方,即為0.5.而我們用上面V的格式,就能這樣寫:>
*(-1)^0 1.011 * 2 ^ 2
即S = 0; M = 1.011; E = 2;
對於-5.5,用上面V的格式, 就可以錶示為
*(-1)^1 (1.011) * 2 ^2;
對於浮點數在內存中的存儲,有以下規定
對於單精度浮點數而言
對於雙精度浮點數:>
此外還有一些規定: 因為M總是>=1 小於2, 即M永遠是等於1的整數, 因此,在內存中存放時,只會存小數比特,例 5.5
可以錶示為**(-1)^0 1.011 * 2 ^ 2*, M = 1.011。 但我們存儲的收, 只會存儲011, 而當我們去使用的時候, 才會把1給補上。
對於指數E而言, 其首先是一個unsigned int類型的數, 因此它的範圍為 0 ~ 255(8bit) 或者 0 ~2047(11bit)
而用科學計數法錶示的時候, 難免會出現E為負數的情况 例如 十進制0.5 用二進制數錶示為:>
1*10 ^-1 又E的範圍大於等於0, 因此, 規定存入內存E的真實值必須再加上一個中間數, 即加127 (8bit) 或1023(11bit)後,再存入內存
例如剛才的-1.,保存成32比特浮點數時, 保存為 -1 + 127 = 126即
01111110
此外, 指數E還有以下規定:>
若E的值不全為1或0, 則E的真實值就為內存中存儲的值减去127(或1023),再將有效數字M前加上第一比特的一。
例如剛才的0.5 二進制V錶示為:>
1.0*2 ^ -1 此處E為-1, M為1.0,因此存進內存中的數據為
0 01111110 00000000000000000000000
若E中存儲的數據為全0時, 那麼我們想一下, 則將是一個多麼小的數字!,即2^ -127次方, 因此, 規定如下:>
當E中存儲的數據為全0時, 其指數E的真實值為 1 - 127(或1023), 且有效數字M前不再加上一, 而是加上0, 以此來錶示一個接近0的數。
當E中存儲的數據為全一時, 那麼E的真實值為128(8bit), 那麼2^E次方是一個非常大的數字, 因此,V錶示為正負無窮大。
現在我們重新回到開頭的第一道例題:>
#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;
}
再看一下第二部分:>
以浮點數的形式將n改成了9.0,那麼9.0的二進制錶示為:>
1001.0即1.001*2^3 那麼S = 0; E = 3 + 127 = 130; M = 0.001.即
0 1000 0010 00100000000000000000000
因此以整數的形式來看,這個數據為:>
以浮點數的形式來看, 當然是9.0了。
边栏推荐
猜你喜欢
Sword finger offer II 032 Effective anagrams
剑指offer 第 3 天字符串(简单)
出手即不凡,这很 Oracle!
It is extraordinary to make a move, which is very Oracle!
leetcode - 384. Scramble array
Drawing cubes with Visio
Sword finger offer day 3 string (simple)
[data visualization] 360 ° teaching you how to comprehensively learn visualization - Part 1
指针,它那些不得不说的题目
How to implement a high-performance load balancing architecture?
随机推荐
list. replace, str.append
时间过滤器(el-table)中使用
剑指 Offer II 025. 链表中的两数相加
How to implement a high-performance load balancing architecture?
重磅直播|BizDevOps:数字化转型浪潮下的技术破局之路
剑指 Offer 04. 二维数组中的查找
[flask tutorial] flask overview
Django framework - caching, signaling, cross site request forgery, cross domain issues, cookie session token
nacos无法修改配置文件Mysql8.0的解决方法
Spoken English - weak reading
Confusion caused by the ramp
Golang keyboard input statement scanln scanf code example
Reload cuda/cudnn/pytorch
You can't specify target table 'xxx' for update in from clause
Conway's law can not be flexibly applied as an architect?
Sword finger offer II 028 Flatten multi-level bidirectional linked list
PPT绘图之AI助力论文图
《MongoDB入门教程》第01篇 MongoDB简介
更新pip&下载jupyter lab
Heavyweight live | bizdevops: the way to break the technology situation under the tide of digital transformation