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

2021-10-08 04:23:37 字數 1424 閱讀 9528

整數在記憶體中的儲存方式比較簡單,我們來看看小數在記憶體中的儲存方式。首先,要學會十進位制小數與二進位制小數之間的轉換。

(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

#include

#include

using

namespace std;

typedef

long

long ll;

intmain()

我們發現輸出結果均為1065353216

分析:由於1.0為float型資料,佔4位元組,可以知道1.0在記憶體中儲存為0 01111111 00000000000000000000000,對於語句 *(int *)&x,意思就是說先將float型的x的指標強制轉換為int型的指標,然後取出值。由於是按照float型資料儲存的,而卻解釋成int型,即對應的int整數為

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

整數在記憶體中的儲存方式比較簡單,我們來看看小數在記憶體中的儲存方式。首先,要學會十進位制小數與二進位制小數之間的轉換。1 二進位制小數轉化為十進位制小數 比如把二進位制小數110.11轉化為十進位制小數,步驟如下 2 十進位制小數轉化為二進位制小數 方法是這樣的 先分別把十進位制小數的整數部分和小...

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

整數在記憶體中的儲存方式比較簡單,我們來看看小數在記憶體中的儲存方式。首先,要學會十進位制小數與二進位制小數之間的轉換。1 二進位制小數轉化為十進位制小數 比如把二進位制小數110.11轉化為十進位制小數,步驟如下 2 十進位制小數轉化為二進位制小數 方法是這樣的 先分別把十進位制小數的整數部分和小...

小數在記憶體中的儲存方式

小數的儲存跟其他型別資料的儲存方式有很大的不同,我們通常用科學技術法來表示很大或者很小的數,即用乙個尾數 mantissa 乙個基數 base 乙個指數 exponent 以及乙個表示正負的符號來表達實數。比如123.456 用十進位制科學計數法可以表達為 1.23456 10 2 其中1.2345...