1、C++中的基本類型
類型 含義 大小(bit)
bool 布爾類型 未定義
char 字符 8
wchar_t 寬字符 16
char16_t Unicode 16
char32_t Unicode 32
short 短整形 16
int 整形 16/32
long 長整形 32/64
long long 超長整形(C++11) 64/128
float 單精度浮點 32 6位有效數字
double 雙精度浮點 64 10位有效數字
long double 長雙精度浮點 96/128 10位有效數字
一個int至少和一個short一樣大,一個long至少和int一樣大,一個long long至少和一個long一樣大,long long是C++11新定義的整數類型。
一般來說,float和double分別有7位和16個有效位,long double通常用於浮點需求的硬件,具體實現不同,精度也會不同。
2、有符號和無符號
除了bool和擴展性字符型(除了char類型的字符型),其他整形可以通過unsigned關鍵字派生出無符號類型。
例如 unsigned int,unsigned long。其中unsigned int可以縮寫爲unsigned。
有符號整形的取值爲負數,0,正數。
無符號整形的取值爲0,正數。無符號由於沒有符號位,所以無符號整形可以表示更大的數。
【你造嗎?】
【與整形不同,字符型分成了char,unsigned char,signed char三種。特別需要注意的是char和signed char並不一樣。雖然字符型有三種,但是字符的表現形式只有兩種:有符號,無符號。char實際上表現爲哪一種,要依賴於編譯器。C++標準並沒還有規定char應該如何表示,但是約定了在表示範圍內正數和負數應該平衡。因此signed char理論上可以表示-127到127之間的數。通常計算機會將表示範圍定位-128到127。】
【學着點!】
【1、當明確得知數值不爲負數時,請用無符號類型】
【2、儘量使用int計算,long往往太大,short往往太小,如果你的範圍超過了int,更建議用long long】
【3、算數的時候不要用char和bool,有些機器上char是有符號的,有些機器上是無符號的,所以char特別不穩定,但是如果你迫切想使用它來表示一個很小的數,請明確指出是signed char還是unsigned char。】
【4、運算小數的時候儘量用double,float往往會丟失精度,而float和double的運算效率相差無幾。而long double一般情況是不會用到的,而它的效率往往不行。】
2、基本類型的類型轉換
當我們講一種類型賦值給另一種類型的時候,系統自動會進行轉換。
例如:
bool b = 42; //b爲真
int i = b; //i爲1
i = 3.14; //i爲3
double pi = i; //pi爲3.0
unsigned char c = -1; //c爲255
signed char c2 = 256; //c2的值爲未定義
由上可知:
1、如果把非bool類型的值賦給bool類型,0爲false,非0爲true;
2、如果把bool類型賦值給非bool類型,true爲1,false爲0;
3、如果把小數賦給整數類型,結果只保留整數部分;
4、如果把整數賦給小數,小數位爲0;
5、如果給無符號類型賦值負數,結果爲對無符號表示範圍的總數取模。
比如 unsigned char表示範圍是0-255,賦值-1就是-1對256取模,得出255。
6、如果賦值的值超出了類型的表示範圍,結果是未定義的,程序可能繼續工作,可能崩潰,也可能產生垃圾數據。有些編譯器會按照5的方式來解決。
把非bool類型放入if條件中,會自動講該值轉換成bool值進行判斷。
int a = 3;
if(a)
{
}
//a非0,結果爲true
我們也可以講表達式放入if語句中,例如
if(a-3)
{
}
雖然可以如此做,但是儘量不要,這樣會讓程序的可讀性變差。
3、含有無符號類型的表達式
儘管我們不會故意給無符號對象賦一個負值,但是實際中可能經常無意這麼幹。
例如,一個算術表達式中既有無符號又有int,那麼int會變成無符號。把int轉換成無符號數的過程和把int直接賦給無符號變量一樣。
usigned u = 10;
int i = -42;
i + i; //結果爲-84
i + u; //結果爲4294967264,並不是你想要的-32
在i+u運算時,會把int轉換成無符號數,那麼結果就是-42對int表示的數的數量取模
當無符號數中減去一個值,不管這個值是不是無符號數,我們都要確保結果不能爲負
unsigned u1=42,u2=10;
u1 - u2; //32
u2 - u1; //爲4294967264
我們如果寫一個輸出10到0的數,我們會這麼寫
for (int i = 10; i >= 0;--i)
std::cout << i << endl;
可能你會覺得,反正不會輸出負數,那麼幹脆用無符號來弄吧,於是就有了下面的寫法
for (unsigned i = 10; i >= 0;--i)
std::cout << i << endl;
然後這個結果,絕對不是你想要的,因爲它是死循環。當i爲0時,最後執行--i,本來i應該爲-1,但是由於它是無符號數,最後又模回來了,結果就成了很大的數,所以永遠不會滿足跳出的條件。
對於這種情況,有一個解決辦法,用while代替for
unsigned u = 11;
while( u > 0 )
{
--u;
std::cout << u <<endl;
}
【切記】
【最好不要將有符號和無符號同時加入表達式中,這樣很容易出錯,比如a*b,a=-1,b=1,從表達式的角度看,顯然結果是-1,但是如果a是int,b是unsigned,那麼結果就是4294967295】