C++基本內置類型


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版)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM