小数在内存中的存储表示
整數在內存中的存儲方式比較簡單,我們來看看小數在內存中的存儲方式。首先,要學會十進制小數與二進制小數之間的轉換。
? ?
(1)二進制小數轉化為十進制小數
??
? ?比如把二進制小數110.11轉化為十進制小數,步驟如下:
? ?
(2)十進制小數轉化為二進制小數
? ?方法是這樣的:先分別把十進制小數的整數部分和小數部分轉化為二進制,然后合并即可。當然整數部分很簡單,直接進行二進制轉化,而小數部分就不一樣了。
? ?具體做法是:用2乘十進制小數,可以得到積,將積的整數部分取出,再用2乘余下的小數部分,又得到一個積,再將積的整數部分取出,如此進行,直到積中的整數部分為零,或者整數部分為1,此時0或1為二進制的最后一位,或者達到所要求的精度為止。比如:
? ?將十進制小數173.8125轉化為二進制小數
? ?
? ?
? ?即
所以最終得到:
那么,小數在內存中是怎么存儲的呢?
無論是單精度小數還是雙精度小數,在存儲中都分為三個部分。
? (1)符號位 ? ? ? ? ? 0代表正,1代表負
? (2)指數位 ? ? ? ? ??用于存儲科學計數法中的指數數據,并且采用移位存儲
? (3)尾數部分
指數有正有負,注意指數位采用移位存儲,偏移量為127,假設指數為2,那么指數碼表示為129的二進制形式,即10000001
在內存中從高位到低位依次是符號位,指數位和尾數部分。
? ?float ?的符號位占1位,指數位占8位,尾數部分占23位
? ?double 的符號位占1位,指數位占11位,尾數部分占52位
我們以173.8125為例,我們知道計算機只認識二進制數據,由于173.8125對應的二進制數據為10101101.1101
那么把10101101.1101寫成,實際上任何一個十進制小數轉化為二進制小數后都可以表示為(小數點前面的1是固定的,所以不進行存儲),那么尾數部分存儲的實際上就是,而指數位存儲的就是127+m的二進制形式,當m=7時為10000110。
所以173.8125在內存中存儲為0 10000110 01011011100000000000000
下面有一段代碼:
#include <iostream> #include <string.h> #include <stdio.h>using namespace std; typedef long long LL;int main() {float x = 1.0;cout<<(int &)x<<endl;cout<<*(int *)&x<<endl;return 0; }
我們發現輸出結果均為1065353216
分析:
由于1.0為float型數據,占4字節,可以知道1.0在內存中存儲為0 01111111 00000000000000000000000,對于語句?*(int *)&x,意思就是說先將float型的x的指針強制轉換為int型的指針,然后取出值。由于是按照float型數據存儲的,而卻解釋成int型,即對應的int整數為,而(int &)x就相當于*(int *)&x
? ?
總結
以上是生活随笔為你收集整理的小数在内存中的存储表示的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Bell数的生成函数推导
- 下一篇: CanvasRenderingConte