標籤:char 選擇 c++ 資料類型 字串
如何選擇類型
1)當數值不可能為負時,選擇無符號類型。
2)當數值超過了int的表示範圍時,選用long long。
3)在算術運算式中不要使用char或bool,只有在存放字串或布爾值時才使用它們。因為類型char在一些機器中是有符號的,而在另一些機器中又是無符號的。如果你需要使用一個不大的整數,那麼明確指定它的類型是signed char或者unsigned char。
4)執行浮點數運算選用double,這是因為float通常精度不夠而且雙精確度浮點數和單精確度浮點數的計算代價相差無幾。事實上,對於某些機器而言,雙精確度運算甚至比單精確度還快。long double提供的精度在一般情況下是沒有必要的,況且它帶來的運算時間消耗也是不容小覷的。
類型轉換
1)當我們把一個非布爾類型的算術值賦給布爾類型時,初始值為0則結果為false,否則結果為true。
2)當我們把一個布爾值賦給非布爾類型時,初始值為false則結果為0,初始值為true則結果為1.
3)當我們把一個浮點數賦給整數類型時,進行了近視處理。結果值將保留浮點數中小數點之前的部分。
4)當我們賦給無符號類型一個超出它表示範圍的值時,結果是初始值對無符號類型表示數值總數模數後的餘數。例如,8位元大小的unsigned char可以表示0至255區間的值,如果我們賦了一個區間以外的值,則實際的結果是該值對256模數後所得的餘數。因此,把-1賦給8位元大小的unsigned char所得的結果是255。
5)當我們賦給帶符號類型一個超出它表示範圍的值時,結果是未定義的(undefined)。此時,程式可能繼續工作、可能崩潰,也可能產生垃圾資料。
無符號數的轉換
下面再來展示一個有意思的代碼片。
unsigned u = 10;int i = -42;cout<<i + i<<endl; // 輸出:-84cout<<u + i<<endl; // 輸出:4294967264
第一個輸出應該就不用說了,對於第二個,首先將-42轉換成無符號數,把負數轉換成無符號數類似於直接給無符號數賦一個負值,結果就等於這個負數加上無符號數的摸。是不是有些拗口呢?看看下面的代碼呢?
int i = -42;unsigned w=i;cout<<w<<endl; // 輸出為:4294967254
在來看看下面這段代碼:
unsigned u1=42,u2=10;cout<<u2-u1<<endl; // 輸出:4294967264unsigned u=-32;cout<<u<<endl; // 輸出:4294967264 和上面的兩段代碼一樣,都是將-32轉換為無符號數
還有一點需要注意的。比如在寫一個將數字從10到0的降序輸出時,考慮到無符號數不會小於0這一鐵律,你是否會這樣寫呢?
for(unsigned i =10; i>=0; --i) cout<<i<<endl;
這是一個陷阱…… 因為當i等於0的時候,輸出0是顯然的,然而在繼續執行for迴圈中的自減操作後得到了-1,-1並不滿足無符號數的要求,因此就像前面的例子那樣就被轉換成了一個合法的無符號數(4294967295)。
解決這個問題的關鍵在於要在輸出變數之前先減去1。這樣的話,如果迴圈從10開始,減去1後輸出結果就成了9到0了,因此初始化時要設定為11。
而且最終截斷點不應該是i==0,而應該是i>0,所以應該這樣改:
for(unsigned i =11; i>0;){ --i; cout<<i<<endl;}
當然了,既然截斷點是大於0,這正好可以用上while迴圈了。
unsigned i =11;while(i>0) // 此處寫成 while(i) 也是可以的{ --i; cout<<i<<endl;}
【C++注意事項】1 資料類型及類型轉換