整數在記憶體中的儲存方式比較簡單,我們來看看小數在記憶體中的儲存方式。
首先,要學會十進位制小數與二進位制小數之間的轉換。
(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是固定的,所以不進行儲存
),那麼尾數部分儲存的實際上就是
所以173.8125在記憶體中儲存為0 10000110 01011011100000000000000
下面有一段**:
#include #include #include using namespace std;
typedef long long ll;
int main()
{ float x = 1.0;
cout<1065353216
分析:
由於1.0為
float
型資料,佔4位元組,可以知道1.0在記憶體中儲存為
0 01111111 00000000000000000000000
,對於語句*(int *)&x,意思就是說先將float型的x的指標強制轉換為int型的指標,然後取出值。由於是按照float型資料儲存的,而卻解釋成int型,即對應的int整數為(int &)x就相當於*(int *)&x
小數在記憶體中的儲存表示
整數在記憶體中的儲存方式比較簡單,我們來看看小數在記憶體中的儲存方式。首先,要學會十進位制小數與二進位制小數之間的轉換。1 二進位制小數轉化為十進位制小數 比如把二進位制小數110.11轉化為十進位制小數,步驟如下 2 十進位制小數轉化為二進位制小數 方法是這樣的 先分別把十進位制小數的整數部分和小...
小數在記憶體中的儲存表示
整數在記憶體中的儲存方式比較簡單,我們來看看小數在記憶體中的儲存方式。首先,要學會十進位制小數與二進位制小數之間的轉換。1 二進位制小數轉化為十進位制小數 比如把二進位制小數110.11轉化為十進位制小數,步驟如下 2 十進位制小數轉化為二進位制小數 方法是這樣的 先分別把十進位制小數的整數部分和小...
小數在記憶體中的儲存方式
小數的儲存跟其他型別資料的儲存方式有很大的不同,我們通常用科學技術法來表示很大或者很小的數,即用乙個尾數 mantissa 乙個基數 base 乙個指數 exponent 以及乙個表示正負的符號來表達實數。比如123.456 用十進位制科學計數法可以表達為 1.23456 10 2 其中1.2345...