天天看點

【C++注意事項】1 資料類型及類型轉換

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)。此時,程式可能繼續工作、可能崩潰,也可能生成垃圾資料。

下面再來展示一個有意思的代碼片。

第一個輸出應該就不用說了,對于第二個,首先将-42轉換成無符号數,把負數轉換成無符号數類似于直接給無符号數賦一個負值,結果就等于這個負數加上無符号數的摸。是不是有些拗口呢?看看下面的代碼呢?

在來看看下面這段代碼:

還有一點需要注意的。比如在寫一個将數字從10到0的降序輸出時,考慮到無符号數不會小于0這一鐵律,你是否會這樣寫呢?

這是一個陷阱…… 因為當i等于0的時候,輸出0是顯然的,然而在繼續執行for循環中的自減操作後得到了-1,-1并不滿足無符号數的要求,是以就像前面的例子那樣就被轉換成了一個合法的無符号數(4294967295)。

解決這個問題的關鍵在于要在輸出變量之前先減去1。這樣的話,如果循環從10開始,減去1後輸出結果就成了9到0了,是以初始化時要設定為11。

而且最終截斷點不應該是i==0,而應該是i>0,是以應該這樣改:

當然了,既然截斷點是大于0,這正好可以用上while循環了。

備注:該【c++注意事項】系列參考了《c++ prime 》一書和網絡資源,主要用于給自己複習、總結,也希望對廣大讀者有幫助。

感謝您的通路,希望對您有所幫助。 歡迎大家關注、收藏以及評論。

我的更多部落格文章:nomasp部落格導讀

為使本文得到斧正和提問,轉載請注明出處:

http://blog.csdn.net/nomasp

繼續閱讀