C C 中基本資料型別在記憶體中是如何儲存的

2021-06-22 10:48:01 字數 3502 閱讀 1386

以windows32位系統為例,先來看看各種型別的資料占用的記憶體大小。
型別

大小(位元組)

bool

1 char

short

intlong

float

double

(1)bool

在我的電腦中通過sizeof(bool)計算得到該型別占用1個位元組,不過網上有人說該型別實際上是int型佔4個位元組,可能不同地方大小不一;

(2)char

char是字元型,占用乙個位元組,即8位:

1/01/0

1/01/0

1/01/0

1/01/0

即有2^8=256個狀態,可以表示256個不同的值,只是當有符號和無符號時表示的範圍不同,我們平時的所用的每乙個字元在記憶體中都由8位2進製數來表示,比如字元』a』,在ascll碼中對應65,在記憶體中為:

0 1 

0 0 

0 0 

0 1 

(3)short、int、long

這三種型別表示整型數每種型別在記憶體中的長度為2、4、4位元組,即16位、32位、32位。當有符號和無符號時每一種表示的範圍都有所不同。我只討論在記憶體中的儲存情況,對於具體的表示範圍就不討論了。

(4)float

float型在記憶體中有4位元組32位,採用ieee754單精度浮點格式:

如上圖所示,該格式最高一位是符號位,0位正,1位負,後面8位為無符號整型數,表示範圍為0~255,後面23位小數為,索引從22到0分別對應2^-1到2^-23,則表示的數為

double型在記憶體中有8位元組64位,採用ieee754雙精度浮點格式:

如上圖所示,該格式最高位也為符號位,0位正,1位負,後面11位為無符號整型數,表示範圍為0~2^11-1,後面52位小數為,索引從51到0分別對應2^-1到2^-52,則表示的數為

(6)下面通過幾個例子來深化對於這幾種型別在記憶體中儲存的理解

char ch = 'a'; //           0100 0001

short s = ch; // 0000 0000 0100 0001

cout << s << endl;

ch是字元型,字元『a』在記憶體中為0100 0001,由於s是short型,在記憶體中佔16位,這樣複製過來後會將ch複製到s的低8位,則s為0000 0000 0100 0001。

short s = 323;  // 0000 0001 0100 0011

char ch = s; // 0100 0011

cout << ch << endl;

在這一段**中s是short型,在記憶體中佔16位,而ch是字元型只佔8位,在將short型複製給char型是不會為了保證接近而將高8位複製過去,而是將short的低8位複製給char,這樣的話,在該段**中s在記憶體中為0000 0001 0100 0011,則複製後ch為0100 0011 = 67,對應ascll碼中『c』,則會輸出『c』。

short s = 2^10 + 2^3 + 2^0;//                     0000 0100 0000 1001

int i = s; // 0000 0000 0000 0000 0000 0100 0000 1001

cout << i << endl;

將s複製到i的低16位,如注釋所示。

int i = 2^23 + 2^21 + 2^14 + 7; //0000 0000 1010 0000 0100 0000 0000 0111

short s = i; // 0100 0000 0000 0111

cout << s << endl; // s = 2^14 + 7

將int型複製給short型時會將低16位複製過來,如注釋所示.

short s = -1;//                     1111 1111 1111 1111

int i = s; // 1111 1111 1111 1111 1111 1111 1111 1111

cout << i << endl;

這個例子中s是負數,負數在計算機中是用補碼表示的,short型-1的原碼為1000 0000 0000 0001,則補碼為1111 1111 1111 1111;

複製給int時為10000 0000 0000 0000 0000 0000 0000 0001,符號位仍在最高位,補碼為 1111 1111 1111 1111 1111 1111 1111 1111;

int i = 5;    // 0000 0000 0000 0000 0000 0000 0000 0101

float f = i; // 0100 0000 1010 0000 0000 0000 0000 0000

cout << f << endl;

由於int型和float型的協議不同,這樣複製的開銷會比較大,雖然兩種型別都是32位,因為每次複製都將計算對應的位應該是什麼。

5 = 2.5 * 2^1 = 1.25 * 2^2;則符號位為0,無符號整型數為exp = 2 + 127 = 129,0.25 = 2^-2;

所以f在記憶體中為:0100 0000 1010 0000 0000 0000 0000 0000

int i = 37;           //0000 0000 0000 0000 0000 0000 0010 0101

float f = *(float*)&i;//0000 0000 0000 0000 0000 0000 0010 0101

cout << f << endl;

此時f和i在記憶體中是完全一致的,因為計算機在計算f是直接通過指標操作,雖然這篇記憶體區域原來儲存的是int型,但由於通過轉化為float型指標,計算機就認為該片記憶體中的內容就是float型的,所以直接將這篇區域中的數直接複製過來。由於37都落在了float型的小數字,所以f會是乙個很小很小的浮點數。

通過這幾個例子應該能夠很好的理解各種型別在計算機記憶體中是如何儲存的。

C C 基本資料型別

學了c然後c 然後mfc windows,然後是c 其中資料型別很多,由基本型別衍生的typedef型別也n多。熟知基本資料型別是我們正確表達實際問題中各種資料的前提,因此我分類總結了一下c c windows c 基本資料型別,以便日後查閱。ansi c c 基本資料型別 說明 1 型別修飾符si...

C C 基本資料型別

學了c然後 c 然後 mfc windows,然後是c 其中資料型別很多,由基本型別衍生的 typedef 型別也n 多。熟知基本資料型別是我們正確表達實際問題中各種資料的前提,因此我分類總結了一下 c c windows c 基本資料型別,以便日後查閱。ansi c c 基本資料型別 type s...

c c 基本資料型別

整型 浮點型 int main 執行結果 size char 1 short int 2 int 4 long 4 long long int 8 int long long 8 long long 8 三種寫法相同 float 4 double 8型別 大小 byte char 1short 2i...