C++基本内置类型
基本內(nèi)置類型包括算術(shù)類型和空類型。
算術(shù)類型
算術(shù)類型包括整型和浮點(diǎn)型。
| bool | 布爾型 | - |
| char | 字符型 | 8 bit |
| wchar_t | 寬字符型 | 16 bit |
| short | 短整型 | 16 bit |
| int | 整形 | 16 bit |
| long | 長(zhǎng)整型 | 32 bit |
| long long | 長(zhǎng)整型 | 64 bit |
| float | 單精度浮點(diǎn)型 | 6位有效數(shù)字 |
| double | 雙精度浮點(diǎn)型 | 10位有效數(shù)字 |
| long double | 擴(kuò)展精度浮點(diǎn)型 | 10位有效數(shù)字 |
C++中規(guī)定,一個(gè)int至少和一個(gè)short一樣大,一個(gè)long至少和一個(gè)int一樣大,一個(gè)long long則至少和一個(gè)long一樣大,其中,數(shù)據(jù)類型long long是在C++11中新定義的。
通過(guò)代碼查看當(dāng)前編譯器各種類型所占尺寸。
#include<iostream> using namespace std;int main() {cout << "bool\t" << sizeof(bool) << endl;cout << "char\t" << sizeof(char) << endl;cout << "wchar_t\t" << sizeof(wchar_t) << endl;cout << "short\t" << sizeof(short) << endl;cout << "int\t" << sizeof(int) << endl;cout << "long\t" << sizeof(long) << endl;cout << "long long\t" << sizeof(long long) << endl;cout << "float\t" << sizeof(float) << endl;cout << "double\t" << sizeof(double) << endl;cout << "long double\t" << sizeof(long double) << endl;system("pause");return 0; }運(yùn)行結(jié)果
bool 1 char 1 wchar_t 2 short 2 int 4 long 4 long long 8 float 4 double 8 long double 8 請(qǐng)按任意鍵繼續(xù). . .- 如何選取算術(shù)類型?
和C語(yǔ)言一樣,C++的設(shè)計(jì)準(zhǔn)則之一也是盡可能的接近硬件。C++的算術(shù)類型必須滿足各種硬件特質(zhì),所以他們常常顯得復(fù)雜而令人不知所措。事實(shí)上,大多數(shù)程序員能夠(也應(yīng)該)對(duì)數(shù)據(jù)類型的使用做出限定從而簡(jiǎn)化選擇過(guò)程。以下是選擇類型的一些經(jīng)驗(yàn)準(zhǔn)則:
1:當(dāng)明確知曉數(shù)值不可能為負(fù)時(shí),選用無(wú)符號(hào)類型
2:使用int 執(zhí)行整數(shù)運(yùn)算。在實(shí)際應(yīng)用中,short 常常顯得太小而long 一般和 int 有一樣的尺寸。如果你的數(shù)值超過(guò)了int 的表示范圍,選用long long
3:在算術(shù)表達(dá)式中不要使用char 或 bool,只用在存放字符或布爾值時(shí)才使用它們。因?yàn)轭愋蚦har在一些機(jī)器上是有符號(hào)的,而另一些機(jī)器上又是無(wú)符號(hào)的,所以,如果使用char進(jìn)行運(yùn)算特別容易出問(wèn)題。如果你需要使用一個(gè)不大的整數(shù),那么明確指定的類型是 signed char 或者unsigned char;
4:執(zhí)行浮點(diǎn)數(shù)運(yùn)算選用double,這是因?yàn)閒loat通常精度不夠而且double和float的計(jì)算相差無(wú)幾。事實(shí)上,對(duì)于某些機(jī)器來(lái)說(shuō),雙精度運(yùn)算甚至比單精度還快,long double提供的精度一般情況下是沒(méi)有必要的,況且他帶來(lái)的運(yùn)行時(shí)消耗也不容忽視。
帶符號(hào)和無(wú)符號(hào)類型
除去布爾型和擴(kuò)展的字符型之外,其他整型可以劃分為帶符號(hào)的和無(wú)符號(hào)的兩種。帶符號(hào)類型可以表示正數(shù)、負(fù)數(shù)和0,無(wú)符號(hào)類型則僅能表示大于等于0的值。
類型int、short、long和long long都是帶符號(hào)的,通過(guò)在這些類型名前添加unsigned就可以得到無(wú)符號(hào)類型,例如unsigned long。類型unsigned int可以編寫(xiě)為unsigned。
與其他整型不同,字符型被分為了三種:char、signed char和unsigned char。特別需要注意的是:類型char和類型signed char并不一樣。盡管字符型有三種,但是字符的表現(xiàn)形式卻只有兩種:帶符號(hào)的和無(wú)符號(hào)的。類型char實(shí)際上會(huì)表現(xiàn)為上述兩種形式中的一種,具體是哪種由編譯器來(lái)決定。
類型的轉(zhuǎn)換
類型所能表示的值的范圍決定了轉(zhuǎn)換的過(guò)程:
- 當(dāng)我們把一個(gè)非布爾型的算術(shù)值賦給布爾類型時(shí),初始值0則結(jié)果是false,否則結(jié)果為true。例如:bool b=42;
- 當(dāng)我們把一個(gè)布爾型值賦給一個(gè)非布爾型時(shí),初始值為false則結(jié)果是0,初始值為true則結(jié)果為1.
- 當(dāng)我們把一個(gè)浮點(diǎn)數(shù)賦給整型類型時(shí),進(jìn)行了近似處理。結(jié)果值將僅保留浮點(diǎn)數(shù)中小數(shù)點(diǎn)之前的部分。
- 當(dāng)我們把一個(gè)整數(shù)值賦給浮點(diǎn)類型時(shí),小數(shù)部分記為0。如果該整數(shù)所占的空間超過(guò)了浮點(diǎn)類型的容量,精度可能有損失。
- 當(dāng)我們賦給無(wú)符號(hào)類型一個(gè)超過(guò)它表示范圍的值時(shí),結(jié)果是初始值對(duì)無(wú)符號(hào)類型表示數(shù)值總數(shù)取模后的余數(shù)。例如,8比特大小的unsigned char可以表示0至255區(qū)間內(nèi)的值,如果我們賦了一個(gè)區(qū)間以外的值,則實(shí)際的結(jié)果是該值對(duì)256取模后所得的余數(shù)。因此,將-1賦給8比特的unsigned char 所得的結(jié)果是255.
- 當(dāng)我們賦給帶符號(hào)類型一個(gè)超出它表示范圍的值時(shí),結(jié)果是未定義的。此時(shí),程序可能繼續(xù)工作、可能崩潰,也可能生成垃圾數(shù)據(jù)。
含有無(wú)符號(hào)類型的表達(dá)式
盡管我們不會(huì)故意給無(wú)符號(hào)對(duì)象賦一個(gè)負(fù)值,卻可能寫(xiě)出這么做的代碼。例如,當(dāng)一個(gè)算術(shù)表達(dá)式中既有無(wú)符號(hào)數(shù)又有int值時(shí),那個(gè)int值就會(huì)轉(zhuǎn)換為無(wú)符號(hào)數(shù)。把int轉(zhuǎn)換為無(wú)符號(hào)數(shù)的過(guò)程和把int直接覆給無(wú)符號(hào)變量一樣:
unsigned u=10; int i=-42; cout<<i+i<<endl; //輸出-84 cout<<u+i<<endl; //如果int占32位,輸出4294967264在第一個(gè)輸出表達(dá)式里,兩個(gè)(負(fù))整數(shù)相加并得到了期望的結(jié)果。在第二個(gè)輸出表達(dá)式里,相加前首先把整數(shù)-42轉(zhuǎn)換為無(wú)符號(hào)數(shù)。把負(fù)數(shù)轉(zhuǎn)換為無(wú)符號(hào)數(shù)類似于直接給無(wú)符號(hào)數(shù)賦一個(gè)負(fù)值,結(jié)果等于這個(gè)負(fù)數(shù)加上無(wú)符號(hào)數(shù)的模。
當(dāng)從無(wú)符號(hào)數(shù)中減去一個(gè)值時(shí),不過(guò)這個(gè)值是不是無(wú)符號(hào)的數(shù),我們都必須確保結(jié)果不能是一個(gè)負(fù)值。
如果表達(dá)式里既有帶符號(hào)類型又有無(wú)符號(hào)類型,當(dāng)帶符號(hào)類型取值為負(fù)時(shí)會(huì)出現(xiàn)異常結(jié)果,這是因?yàn)閹Х?hào)數(shù)會(huì)自動(dòng)轉(zhuǎn)換為無(wú)符號(hào)數(shù)。例如,在一個(gè)形如”a*b"的式子中,如果a=-1,b=1,而且a是int,b是unsigned,則結(jié)果須視在當(dāng)前機(jī)器上int所占位數(shù)而定。
總結(jié)
- 上一篇: rpm方式安装mysql-5.7.11
- 下一篇: [C/C++] constexpr函数