小數在記憶體中的儲存表示

2021-08-17 02:20:39 字數 1807 閱讀 4110

整數在記憶體中的儲存方式比較簡單,我們來看看小數在記憶體中的儲存方式。

首先,要學會十進位制小數與二進位制小數之間的轉換。

(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...