C/C++學習筆記之浮點數的儲存原理
阿新 • • 發佈:2020-12-24
C/C++學習筆記
一、 浮點數的儲存原理
int main(){
float a=100;
return 1;
}
通過以上程式碼可知,浮點數100
轉化為十六進位制"42C8"
,並且以大端儲存的方法低位資料42
和高位資料C8
分別儲存在51處理器記憶體的低地址0x08
和高地址0x09
的單元中。
大端儲存:將資料的**高位**儲存在記憶體的高地址單元中
小端儲存:將資料的**低位**儲存在記憶體的高地址單元中
而在PC處理器中,則是以小端儲存的方式,將低位資料42
和高位資料C8
分別儲存在高地址和低地址單元中。
那麼,浮點數100如何轉化成十六進位制42C8呢? 其步驟如下:
首先將十進位制數100轉化為二進位制數:
100 | 36 | 4 | 4 | 4 | 0 | 0 |
---|---|---|---|---|---|---|
64 | 32 | 16 | 8 | 4 | 2 | 1 |
1 | 1 | 0 | 0 | 1 | 0 | 0 |
36 | 4 | 4 | 4 | 0 | 0 | 0 |
即十進位制數100的二進位制數位01100100
因此得浮點數100為:01100100.00000000……
,取1.1001000……*2^6
,得尾數100100……(位數視處理器位數而定)
,根據IEEE 754
標準,6即為階碼,故有6+127=133
,二進位制表示為:10000101(8位)
,即為階數,由於是正數,故符號數為0(1位)
。假設在32位
處理器中,尾數則有23位
,因此完整的十六進位制表示如下:
0100 0010 1100 1000 0000 0000 0000 0000 (1位符號數+8位階數+23位尾數)
最後結果恰好為42C8。
同理,也可以通過地址單元中的十六進位制轉化為十進位制,但是求得階碼和尾數後,一定要注意在尾數前加上隱去的"1"
,然後再通過二進位制數轉化為十進位制數,即得所求。