C++進階教程(含C++11)(1)變量與基本類型1

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】

發佈了54 篇原創文章 · 獲贊 3 · 訪問量 5萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章