在C++中,數(shù)據(jù)具有不同的類型,類型定義了變量可存儲(chǔ)的數(shù)值范圍以及可進(jìn)行的操作變量是用于內(nèi)存中保存數(shù)據(jù)的,每個(gè)變量都必須有確定的數(shù)據(jù)類型,C++語(yǔ)言的數(shù)據(jù)類型如圖2-1所示。
在圖2-1中,把數(shù)據(jù)類型劃分為基本的數(shù)據(jù)類型和復(fù)合的數(shù)據(jù)類型,我們也可把數(shù)據(jù)類型分為內(nèi)置的類型和用戶定義的類型兩大類,用戶定義的類型在使用以前,必須先定義,包括:結(jié)構(gòu)、類、枚舉和聯(lián)合類型;內(nèi)置的類型是指直接被C++提供的類型,也就是說(shuō),是除用戶定義的類型以外的其它類型。
圖2-1 C++數(shù)據(jù)類型
從語(yǔ)法上來(lái)說(shuō),void類型也是基本的類型,但是,它不是一個(gè)完整的類型,只能作為更復(fù)雜類型的一部分。沒(méi)有void類型的變量,它或者用于指定一個(gè)函數(shù)(在第五章介紹)沒(méi)有返回值,或者作為指針(在第七章介紹)類型,表示該指針指向未知類型的變量,例如:
void x; //錯(cuò)誤,沒(méi)有void變量
void f( ); //函數(shù)f不返回值
void *pv; //指針pv指向未知類型的變量
布爾型、字符型、整型和浮點(diǎn)型也稱為算術(shù)類型;枚舉、指針、數(shù)組、引用、結(jié)構(gòu)、聯(lián)合和類稱之為復(fù)合數(shù)據(jù)類型,它們能通過(guò)其它數(shù)據(jù)類型進(jìn)行構(gòu)造。
在基本的數(shù)據(jù)類型char、 int前可以添加修飾符,以改變基本類型的意義,可用的修飾符有l(wèi)ong、short、signed和unsigned四種,另外,雙精度型前可以加long修飾符?;镜臄?shù)據(jù)類型及其表示范圍,可參見(jiàn)表2-3。
表2-3 基本的數(shù)據(jù)類型及其表示范圍
類型名 類型 字節(jié) 表示范圍
char 字符型 1 -128 ~127
unsigned char 無(wú)符號(hào)字符型 1 0 ~255
signed char 有符號(hào)字符型(與字符型相同) 1 -128 ~127
int 整型 * 與機(jī)器有關(guān)
unsigned int 無(wú)符號(hào)整型 * 與機(jī)器有關(guān)
signed int 有符號(hào)整型(與整型相同) * 與機(jī)器有關(guān)
short int 短整型 2 -32,768~ 32,767
unsigned short int 無(wú)符號(hào)短整型 2 0~65,535
signed short int 有符號(hào)短整型(與短整型相同) 2 -32,768~ 32,767
long int 長(zhǎng)整型 4 -2,147,483,648 ~2,147,483,647
signed long int 有符號(hào)長(zhǎng)整型(與長(zhǎng)整型相同) 4 -2,147,483,648 ~ 2,147,483,647
unsigned long int 無(wú)符號(hào)長(zhǎng)整型 4 0~4,294,967,295
float 浮點(diǎn)型 4 3.4E +/- 38 (7位有效數(shù)字)
double 雙精度型 8 1.7E +/- 308 (15位有效數(shù)字)
long double 長(zhǎng)雙精度型 10 1.2E +/- 4932 (19位有效數(shù)字)
unsigned和signed只用于修飾char和int,且signed修飾詞可以省略。當(dāng)用unsigned修飾詞時(shí),后面的類型說(shuō)明符可以省略。例如:
signed int n; //與"int n;"等價(jià)
signed char ch; //與"char ch;"等價(jià)
unsigned int n; //與"unsigned n;"等價(jià)
unsigned char ch; //與"unsigned ch;"等價(jià)
short只用于修飾int,且用short修飾時(shí),int可以省略,即:
short int n; //與"short n;"等價(jià)
long只能修飾int和double。當(dāng)用long修飾int時(shí),int可以省略,即:
long int n; //與"long n;"等價(jià)
int和unsigned int類型占用一個(gè)機(jī)器一個(gè)字(word)的字節(jié)。在16位操作系統(tǒng)上,它們占用2個(gè)字節(jié);在32位操作系統(tǒng)上,它們占用4個(gè)字節(jié)。
各種數(shù)據(jù)類型精度由低到高排列如圖2-2:
圖2-2
如果一個(gè)雙目運(yùn)算符兩邊的操作數(shù)類型不同,先要將它們轉(zhuǎn)換為相同的類型,即較低類型轉(zhuǎn)換為較高類型,然后再參加運(yùn)算。所謂類型的高低,跟所占的存儲(chǔ)空間大小有直接關(guān)系,所占存儲(chǔ)空間越大的類型,級(jí)別越高。
圖中橫向的箭頭表示必須的轉(zhuǎn)換,如兩個(gè)float型數(shù)參加運(yùn)算,雖然它們類型相同,但仍要先轉(zhuǎn)換成double型再進(jìn)行運(yùn)算,結(jié)果亦為double型??v向箭頭表示當(dāng)運(yùn)算符兩邊的操作數(shù)為不同類型時(shí)的轉(zhuǎn)換,如一個(gè)long型數(shù)據(jù)與一個(gè)int型數(shù)據(jù)一起運(yùn)算,需要先將int型數(shù)據(jù)轉(zhuǎn)換為long型,然后兩者再進(jìn)行運(yùn)算,結(jié)果為long型。所有這些轉(zhuǎn)換都是由系統(tǒng)自動(dòng)進(jìn)行的,使用時(shí)只需了解結(jié)果的類型即可。
程序2-2
#include
void main(void)
{
char a = 'x';
int b = 3,f = 2;
float c = 2.5678;
double d = 5.2345
long e = 32L;
cout<}
下面我們來(lái)分析一下這段程序:
(1) 進(jìn)行d / c運(yùn)算時(shí),要將c轉(zhuǎn)換成double型,運(yùn)算的中間結(jié)果為double型;
(2) 進(jìn)行e * f運(yùn)算時(shí),將f轉(zhuǎn)換為long型,運(yùn)算的中間結(jié)果為long型;
(3) 進(jìn)行a - b運(yùn)算時(shí),將a轉(zhuǎn)換為int型(數(shù)值為ASCⅡ碼值120),運(yùn)算的中間結(jié)果為int型;
(4) 當(dāng)(3)的中間結(jié)果與(1)的中間結(jié)果運(yùn)算時(shí),將(3)的中間結(jié)果轉(zhuǎn)換為double型,運(yùn)算的中間結(jié)果為double型;
(5) 當(dāng)(4)的中間結(jié)果與(2)的中間結(jié)果運(yùn)算時(shí),將(2)的中間結(jié)果轉(zhuǎn)換為double型,得出最后結(jié)果。
于是,程序最后的運(yùn)行結(jié)果為55.038515。
在圖2-1中,把數(shù)據(jù)類型劃分為基本的數(shù)據(jù)類型和復(fù)合的數(shù)據(jù)類型,我們也可把數(shù)據(jù)類型分為內(nèi)置的類型和用戶定義的類型兩大類,用戶定義的類型在使用以前,必須先定義,包括:結(jié)構(gòu)、類、枚舉和聯(lián)合類型;內(nèi)置的類型是指直接被C++提供的類型,也就是說(shuō),是除用戶定義的類型以外的其它類型。
圖2-1 C++數(shù)據(jù)類型
從語(yǔ)法上來(lái)說(shuō),void類型也是基本的類型,但是,它不是一個(gè)完整的類型,只能作為更復(fù)雜類型的一部分。沒(méi)有void類型的變量,它或者用于指定一個(gè)函數(shù)(在第五章介紹)沒(méi)有返回值,或者作為指針(在第七章介紹)類型,表示該指針指向未知類型的變量,例如:
void x; //錯(cuò)誤,沒(méi)有void變量
void f( ); //函數(shù)f不返回值
void *pv; //指針pv指向未知類型的變量
布爾型、字符型、整型和浮點(diǎn)型也稱為算術(shù)類型;枚舉、指針、數(shù)組、引用、結(jié)構(gòu)、聯(lián)合和類稱之為復(fù)合數(shù)據(jù)類型,它們能通過(guò)其它數(shù)據(jù)類型進(jìn)行構(gòu)造。
在基本的數(shù)據(jù)類型char、 int前可以添加修飾符,以改變基本類型的意義,可用的修飾符有l(wèi)ong、short、signed和unsigned四種,另外,雙精度型前可以加long修飾符?;镜臄?shù)據(jù)類型及其表示范圍,可參見(jiàn)表2-3。
表2-3 基本的數(shù)據(jù)類型及其表示范圍
類型名 類型 字節(jié) 表示范圍
char 字符型 1 -128 ~127
unsigned char 無(wú)符號(hào)字符型 1 0 ~255
signed char 有符號(hào)字符型(與字符型相同) 1 -128 ~127
int 整型 * 與機(jī)器有關(guān)
unsigned int 無(wú)符號(hào)整型 * 與機(jī)器有關(guān)
signed int 有符號(hào)整型(與整型相同) * 與機(jī)器有關(guān)
short int 短整型 2 -32,768~ 32,767
unsigned short int 無(wú)符號(hào)短整型 2 0~65,535
signed short int 有符號(hào)短整型(與短整型相同) 2 -32,768~ 32,767
long int 長(zhǎng)整型 4 -2,147,483,648 ~2,147,483,647
signed long int 有符號(hào)長(zhǎng)整型(與長(zhǎng)整型相同) 4 -2,147,483,648 ~ 2,147,483,647
unsigned long int 無(wú)符號(hào)長(zhǎng)整型 4 0~4,294,967,295
float 浮點(diǎn)型 4 3.4E +/- 38 (7位有效數(shù)字)
double 雙精度型 8 1.7E +/- 308 (15位有效數(shù)字)
long double 長(zhǎng)雙精度型 10 1.2E +/- 4932 (19位有效數(shù)字)
unsigned和signed只用于修飾char和int,且signed修飾詞可以省略。當(dāng)用unsigned修飾詞時(shí),后面的類型說(shuō)明符可以省略。例如:
signed int n; //與"int n;"等價(jià)
signed char ch; //與"char ch;"等價(jià)
unsigned int n; //與"unsigned n;"等價(jià)
unsigned char ch; //與"unsigned ch;"等價(jià)
short只用于修飾int,且用short修飾時(shí),int可以省略,即:
short int n; //與"short n;"等價(jià)
long只能修飾int和double。當(dāng)用long修飾int時(shí),int可以省略,即:
long int n; //與"long n;"等價(jià)
int和unsigned int類型占用一個(gè)機(jī)器一個(gè)字(word)的字節(jié)。在16位操作系統(tǒng)上,它們占用2個(gè)字節(jié);在32位操作系統(tǒng)上,它們占用4個(gè)字節(jié)。
各種數(shù)據(jù)類型精度由低到高排列如圖2-2:
圖2-2
如果一個(gè)雙目運(yùn)算符兩邊的操作數(shù)類型不同,先要將它們轉(zhuǎn)換為相同的類型,即較低類型轉(zhuǎn)換為較高類型,然后再參加運(yùn)算。所謂類型的高低,跟所占的存儲(chǔ)空間大小有直接關(guān)系,所占存儲(chǔ)空間越大的類型,級(jí)別越高。
圖中橫向的箭頭表示必須的轉(zhuǎn)換,如兩個(gè)float型數(shù)參加運(yùn)算,雖然它們類型相同,但仍要先轉(zhuǎn)換成double型再進(jìn)行運(yùn)算,結(jié)果亦為double型??v向箭頭表示當(dāng)運(yùn)算符兩邊的操作數(shù)為不同類型時(shí)的轉(zhuǎn)換,如一個(gè)long型數(shù)據(jù)與一個(gè)int型數(shù)據(jù)一起運(yùn)算,需要先將int型數(shù)據(jù)轉(zhuǎn)換為long型,然后兩者再進(jìn)行運(yùn)算,結(jié)果為long型。所有這些轉(zhuǎn)換都是由系統(tǒng)自動(dòng)進(jìn)行的,使用時(shí)只需了解結(jié)果的類型即可。
程序2-2
#include
void main(void)
{
char a = 'x';
int b = 3,f = 2;
float c = 2.5678;
double d = 5.2345
long e = 32L;
cout<}
下面我們來(lái)分析一下這段程序:
(1) 進(jìn)行d / c運(yùn)算時(shí),要將c轉(zhuǎn)換成double型,運(yùn)算的中間結(jié)果為double型;
(2) 進(jìn)行e * f運(yùn)算時(shí),將f轉(zhuǎn)換為long型,運(yùn)算的中間結(jié)果為long型;
(3) 進(jìn)行a - b運(yùn)算時(shí),將a轉(zhuǎn)換為int型(數(shù)值為ASCⅡ碼值120),運(yùn)算的中間結(jié)果為int型;
(4) 當(dāng)(3)的中間結(jié)果與(1)的中間結(jié)果運(yùn)算時(shí),將(3)的中間結(jié)果轉(zhuǎn)換為double型,運(yùn)算的中間結(jié)果為double型;
(5) 當(dāng)(4)的中間結(jié)果與(2)的中間結(jié)果運(yùn)算時(shí),將(2)的中間結(jié)果轉(zhuǎn)換為double型,得出最后結(jié)果。
于是,程序最后的運(yùn)行結(jié)果為55.038515。

