基本內(nèi)置類(lèi)型
算術(shù)類(lèi)型
分兩類(lèi):整型和浮點(diǎn)型
類(lèi)型 | 含義 | 最小尺寸 |
---|---|---|
bool | 布爾類(lèi)型 | 未定義 |
char | 字符 | 8位 |
wchar_t | 寬字符 | 16位 |
char16_t | Unicode字符 | 16位 |
char32_t | Unicode字符 | 32位 |
short | 短整型 | 16位 |
int | 整型 | 16位 |
long | 長(zhǎng)整型 | 32位 |
long long | 長(zhǎng)整型 | 32位 |
float | 單精度浮點(diǎn)數(shù) | 6位有效數(shù)字 |
double | 雙精度浮點(diǎn)數(shù) | 10位有效數(shù)字 |
long double | 擴(kuò)展精度浮點(diǎn)數(shù) | 10位有效數(shù)字 |
帶符號(hào)類(lèi)型和無(wú)符號(hào)類(lèi)型
除去布爾型和擴(kuò)展的字符之外晤斩,其他整型可以劃分為帶符號(hào)的(signed)和無(wú)符號(hào)的(unsigned)兩種信殊。帶符號(hào)類(lèi)型可以表示正數(shù)屉凯、負(fù)數(shù)或0,無(wú)符號(hào)類(lèi)型則僅能表示大于等于0的值艾帐。
類(lèi)型int誓沸、short、long和long long都是帶符號(hào)的茸炒,通過(guò)在這些類(lèi)型名前添加unsigned就可以得到無(wú)符號(hào)類(lèi)型。
與其他整型不同阵苇,字符型被分為了三種:char壁公、signed char和unsigned char。特別需要注意的是:類(lèi)型char和類(lèi)型signed char并不一樣绅项。盡管字符型有三種紊册,但是字符的表現(xiàn)形式卻只有兩種:帶符號(hào)的和無(wú)符號(hào)的。
如何選擇類(lèi)型
- 當(dāng)明確知曉數(shù)值不可能為負(fù)時(shí)快耿,選用無(wú)符號(hào)類(lèi)型囊陡。
- 使用int執(zhí)行正數(shù)運(yùn)算芳绩。在實(shí)際應(yīng)用中,short常常顯得太小而long一般和int有一樣的尺寸撞反。如果你的數(shù)值超過(guò)了int的表示范圍妥色,選用long long。
- 在算術(shù)表達(dá)式中不要使用char或bool遏片,只有在存放字符或布爾值時(shí)才使用它們垛膝。因?yàn)轭?lèi)型char在一些機(jī)器上是有符號(hào)的,而在另一些機(jī)器上又是無(wú)符號(hào)的丁稀,所以如果使用char進(jìn)行運(yùn)算特別容易出問(wèn)題。如果你需要使用一個(gè)不大的整數(shù)倚聚,那么明確指定它的類(lèi)型是signed char或者unsigned char线衫。
- 執(zhí)行浮點(diǎn)數(shù)運(yùn)算選用double,這是因?yàn)閒loat通常精度不夠而且雙精度浮點(diǎn)數(shù)和單精度浮點(diǎn)數(shù)的計(jì)算代價(jià)相差無(wú)幾惑折。事實(shí)上授账,對(duì)于某些機(jī)器來(lái)說(shuō),雙精度運(yùn)算甚至比單精度還快惨驶。long double提供的精度在一般情況下是沒(méi)有必要的白热,況且它帶來(lái)的運(yùn)行消耗也不容忽視。
類(lèi)型轉(zhuǎn)換
bool b = 42; // b為真
int i = b; // i的值為1
i = 3.14; // i的值為3
double pi = i; // pi的值為3.0
unsigned char c = -1; // 假設(shè)char占8bit粗卜,c的值為255
/* 當(dāng)我們賦給無(wú)符號(hào)類(lèi)型一個(gè)超出它表示范圍的值時(shí)屋确,結(jié)果是初始值對(duì)無(wú)符號(hào)類(lèi)型表示數(shù)值總數(shù)取模后的余數(shù)。 */
signed char c2 = 256; // 假設(shè)char占8bit续扔,c2的值是未定義的
/* 當(dāng)我們賦給帶符號(hào)類(lèi)型一個(gè)超出它表示范圍的值時(shí)攻臀,結(jié)果是未定義的(undefined)。 */
避免無(wú)法預(yù)知和依賴(lài)于實(shí)現(xiàn)環(huán)境的行為
含有無(wú)符號(hào)類(lèi)型的表達(dá)式
把負(fù)數(shù)轉(zhuǎn)換成無(wú)符號(hào)數(shù)類(lèi)似于直接給無(wú)符號(hào)數(shù)賦一個(gè)負(fù)值纱昧。
切勿混用帶符號(hào)類(lèi)型和無(wú)符號(hào)類(lèi)型
初始化不是賦值刨啸,初始化的含義是創(chuàng)建變量時(shí)賦予其一個(gè)初始值,而賦值的含義是把對(duì)象的當(dāng)前值擦除识脆,而以一個(gè)新值來(lái)替代设联。
列表初始化:
int units_sold = 0;
int units_sold = {0};
int units_sold(0);
int units_sold{0};
如果我們使用列表初始化且初始值存在丟失信息的風(fēng)險(xiǎn),則編譯器將報(bào)錯(cuò)
long double ld = 3.1415926536;
int a{ld}, b = {ld}; // 錯(cuò)誤:轉(zhuǎn)換未執(zhí)行灼捂,因?yàn)榇嬖趤G失信息的危險(xiǎn)
int c(ld), d = ld; // 正確:轉(zhuǎn)換執(zhí)行离例,且確實(shí)丟失了部分值
默認(rèn)初始化
如果是內(nèi)置類(lèi)型的變量未被顯示初始化,它的值由定義的位置決定纵东。定義于任何函數(shù)體之外的變量被初始化為0粘招。定義在函數(shù)體內(nèi)部的內(nèi)置類(lèi)型變量將不被初始化(uninitialized)。一個(gè)未被初始化的內(nèi)置類(lèi)型變量的值是未定義的偎球,如果試圖拷貝或以其他形式訪問(wèn)此類(lèi)值將引發(fā)錯(cuò)誤洒扎。
定義于函數(shù)體內(nèi)的內(nèi)置類(lèi)型的對(duì)象如果沒(méi)有初始化辑甜,則其值未定義。類(lèi)的對(duì)象如果沒(méi)有顯式地初始化袍冷,則其值由類(lèi)確定磷醋。
建議初始化每一個(gè)內(nèi)置類(lèi)型的變量。雖然并非必須這么做胡诗,但如果我們不能確保初始化后程序安全邓线,那么這么做不失為一種簡(jiǎn)單可靠的方法。
變量聲明和定義
如果想聲明一個(gè)變量而非定義它煌恢,就在變量名前添加關(guān)鍵字extern骇陈,而且不要顯式地初始化變量:
extern int i; // 聲明i而非定義i
int j; // 聲明并定義j