1. 程式人生 > >學習筆記(C++中基礎資料型別在記憶體的表現形式)

學習筆記(C++中基礎資料型別在記憶體的表現形式)

一、整數型別

C++提供的整數型別有三種:int long short ,在Microsoft Visual C++ 6.0中,int型別與long型別在記憶體中都佔4個位元組,short型別佔兩個位元組。

在C++中整數型別又可以分為有符號與無符號型別兩種。

無符號整數

   在記憶體中,無符號整數的所有位都用來表示數值。以無符號整數型資料unsigned int 為例,它在記憶體中佔4個位元組,取值範圍為0x00000000~0xFFFFFFFF。

有符號數

   有符號整數中用來表示符號的是最高位,最高位為0表示正數,最高位為1表示負數。在記憶體中同樣佔4個位元組,由於最高位為符號位,不能用於表示數值,因些有符號整數的取值範圍要比無符號數取值範圍少1位,既0x80000000~0x7FFFFFFF;負數在記憶體中都是以補碼的形式存放。

二、浮點數型別

  在C++中,使用浮點方式儲存實數,用兩種資料型別來儲存浮點數:float(單精度)、double(雙精度)。Float在記憶體中佔4個位元組,double在記憶體中佔8位元組空間。

浮點數的編碼方式

   浮點數編碼轉換採用的是IEEE規定的編碼標準,float和double這兩型別資料的轉換原理相同。IEEE規定的浮點數編碼會將一個浮點數轉換為二進位制數。以科學記數法劃法,將浮點數拆分為3部分:符號、指數、尾數。

float型別的IEEE編碼

   float型別在記憶體中佔4個位元組(32位),最高位用於表示符號;在剩下的31位中,從右向左了8位用於表示指數,其餘用於表示尾數。如圖:

 

正指數情況

例:將float型別10.625轉換為IEEE編碼,需要將10.625轉換成對應的二進位制數:1010.101,整數部分為1010,小數部分為101;然後對單精度數進行科學記數法轉換:將小數點向左移動,每個移動1次指數加1,移動到除符號位的最高位為1處,停止移動,這裡移動3次。對10.625進行科學記數法轉換後二進位制部分為1.010101,指數部分為3。在IEEE編碼中,由於在二進位制情況下最高位始終為1,為一個恆定值,故將其忽略不計。這裡是一個正數,所以符號位為0,指數部分:由於指數部分可能出現負數,十進位制數127可表示為二進位制數01111111。

IEEE編碼方式規定,當指數小於01111111時為一個負數,反之為一個正數。

10.625經IEEE轉換後各位的情況如下:

   符號位:0

   指數位:3+127(十進位制),轉為二進位制 10000010

   尾數位:01010100000000000000000(當不足23位時,低位補0填充)

10.625轉換後的IEEE編碼按二進位制拼接為:01000001001010100000000000000000

轉換成十六進位制數為:0x412A0000,由於記憶體以小尾方式進行排列,故為:00 00 2a 41

負指數

  -0.8125經IEEE轉換後各位的情況如下:

   -0.8125的二進位制為-0.1101

   符號位:1

   指數位:-1+127(十進位制),轉為二進位制 01111110(如果不足8位,高位補0)

   尾數位:10100000000000000000000(當不足23位時,低位補0填充)

-0.8125轉換後的IEEE編碼按二進位制拼接為:10111111010100000000000000000000

轉換成十六進位制數為:0xBF500000,由於記憶體以小尾方式進行排列,故為:00 00 50 BF

如果小數部分轉換為二進位制時得到一個無窮值,則根據尾數長度捨棄多餘部分。

Double型別的IEEE編碼

 Double型別的和float型別大同小異,只是double型別表示的範圍更大,佔用的空間更多,是float型別所佔空間的兩倍。

double型別:指數用11位正數表示,加上1023用於指數符號判斷。

三、字元編碼

  在C++中,字元的編碼格式分兩種:ASCII和Unicode.

  ASCII編碼在記憶體中佔一個位元組大小,只能表示26個字母和常用符號。

  Unicode編碼在記憶體中佔兩個位元組大小,表示的範圍是0~65535.

在Microsoft Visual C++ 6.0中,使用char定義ASCII編碼格式的字元,使用wchar_t定義Unicode編碼格式字元。