C++基本內置類型
基本內置類型包括算術類型和空類型。
算術類型
算術類型包括整型和浮點型。
類型 | 含義 | 最小尺寸 |
---|---|---|
bool | 布爾型 | - |
char | 字符型 | 8 bit |
wchar_t | 寬字符型 | 16 bit |
short | 短整型 | 16 bit |
int | 整形 | 16 bit |
long | 長整型 | 32 bit |
long long | 長整型 | 64 bit |
float | 單精度浮點型 | 6位有效數字 |
double | 雙精度浮點型 | 10位有效數字 |
long double | 擴展精度浮點型 | 10位有效數字 |
C++中規定,一個int至少和一個short一樣大,一個long至少和一個int一樣大,一個long long則至少和一個long一樣大,其中,數據類型long long是在C++11中新定義的。
通過代碼查看當前編譯器各種類型所占尺寸。
#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;
}
運行結果
bool 1
char 1
wchar_t 2
short 2
int 4
long 4
long long 8
float 4
double 8
long double 8
請按任意鍵繼續. . .
- 如何選取算術類型?
和C語言一樣,C++的設計准則之一也是盡可能的接近硬件。C++的算術類型必須滿足各種硬件特質,所以他們常常顯得復雜而令人不知所措。事實上,大多數程序員能夠(也應該)對數據類型的使用做出限定從而簡化選擇過程。以下是選擇類型的一些經驗准則:
1:當明確知曉數值不可能為負時,選用無符號類型
2:使用int 執行整數運算。在實際應用中,short 常常顯得太小而long 一般和 int 有一樣的尺寸。如果你的數值超過了int 的表示范圍,選用long long
3:在算術表達式中不要使用char 或 bool,只用在存放字符或布爾值時才使用它們。因為類型char在一些機器上是有符號的,而另一些機器上又是無符號的,所以,如果使用char進行運算特別容易出問題。如果你需要使用一個不大的整數,那么明確指定的類型是 signed char 或者unsigned char;
4:執行浮點數運算選用double,這是因為float通常精度不夠而且double和float的計算相差無幾。事實上,對於某些機器來說,雙精度運算甚至比單精度還快,long double提供的精度一般情況下是沒有必要的,況且他帶來的運行時消耗也不容忽視。
帶符號和無符號類型
除去布爾型和擴展的字符型之外,其他整型可以划分為帶符號的和無符號的兩種。帶符號類型可以表示正數、負數和0,無符號類型則僅能表示大於等於0的值。
類型int、short、long和long long都是帶符號的,通過在這些類型名前添加unsigned就可以得到無符號類型,例如unsigned long。類型unsigned int可以編寫為unsigned。
與其他整型不同,字符型被分為了三種:char、signed char和unsigned char。特別需要注意的是:類型char和類型signed char並不一樣。盡管字符型有三種,但是字符的表現形式卻只有兩種:帶符號的和無符號的。類型char實際上會表現為上述兩種形式中的一種,具體是哪種由編譯器來決定。
類型的轉換
類型所能表示的值的范圍決定了轉換的過程:
- 當我們把一個非布爾型的算術值賦給布爾類型時,初始值0則結果是false,否則結果為true。例如:bool b=42;
- 當我們把一個布爾型值賦給一個非布爾型時,初始值為false則結果是0,初始值為true則結果為1.
- 當我們把一個浮點數賦給整型類型時,進行了近似處理。結果值將僅保留浮點數中小數點之前的部分。
- 當我們把一個整數值賦給浮點類型時,小數部分記為0。如果該整數所占的空間超過了浮點類型的容量,精度可能有損失。
- 當我們賦給無符號類型一個超過它表示范圍的值時,結果是初始值對無符號類型表示數值總數取模后的余數。例如,8比特大小的unsigned char可以表示0至255區間內的值,如果我們賦了一個區間以外的值,則實際的結果是該值對256取模后所得的余數。因此,將-1賦給8比特的unsigned char 所得的結果是255.
- 當我們賦給帶符號類型一個超出它表示范圍的值時,結果是未定義的。此時,程序可能繼續工作、可能崩潰,也可能生成垃圾數據。
含有無符號類型的表達式
盡管我們不會故意給無符號對象賦一個負值,卻可能寫出這么做的代碼。例如,當一個算術表達式中既有無符號數又有int值時,那個int值就會轉換為無符號數。把int轉換為無符號數的過程和把int直接覆給無符號變量一樣:
unsigned u=10;
int i=-42;
cout<<i+i<<endl; //輸出-84
cout<<u+i<<endl; //如果int占32位,輸出4294967264
在第一個輸出表達式里,兩個(負)整數相加並得到了期望的結果。在第二個輸出表達式里,相加前首先把整數-42轉換為無符號數。把負數轉換為無符號數類似於直接給無符號數賦一個負值,結果等於這個負數加上無符號數的模。
當從無符號數中減去一個值時,不過這個值是不是無符號的數,我們都必須確保結果不能是一個負值。
如果表達式里既有帶符號類型又有無符號類型,當帶符號類型取值為負時會出現異常結果,這是因為帶符號數會自動轉換為無符號數。例如,在一個形如”a*b"的式子中,如果a=-1,b=1,而且a是int,b是unsigned,則結果須視在當前機器上int所占位數而定。
參考
http://blog.csdn.net/lingtianyulong/article/details/24390541
《C++ Primer》(第5版)