回覆列表
  • 1 # 使用者6818057080839

    C++的轉換規則遠比你想象的噁心得多。不同型別間賦值和二元運算時都可能涉及integral promotions[4.5],integral conversions[4.7]舉個例子:

    輸出將會是這裡發生的事情是這樣的——標準規定比較兩個數前,比int小的型別先通通promote成int。那麼前兩個中unsigned char的-1和unsigned short的-1都會被promote成int。promote的過程很有意思,編譯器看到你說-1是char,那他就認為這個-1在promote前是0xFF,又看到你說這個char是unsigned的,那麼他promote成int時就直接在前面填零,即0x000000FF。(如果你要說它是個signed char的-1,它會給你promote成0xFFFFFFFF)接下來就看這一個,現在右邊已經和左邊在位元層面都是32位了,要進行比較的時候問題又來了當左邊的負數和右邊的unsigned作比較時,到底轉換誰?標準規定此時將負數轉成unsigned,也就是左邊的int型-1被當成unsigned對待,值就是,那麼和右邊0x000000FF的值255比較,當然兩者不相等。short的那個同理。最後兩個,即int的-1和long的-1,由於沒有從小整型到大整型promotion的這一步,所以比較結果就為true。上面說的這些東西大可以什麼都不知道,只要平時不要作死在signed和unsigned之間賦值或者進行比較。另外想說的是不要在C++中用C cast了,也即所謂的強制型別轉換,而應該用C++的const_cast, static_cast和reinterpret_cast。因為C casts在C++中是會被替換成這三種cast的組合的,而你不知道什麼時候就會被reinterpret_cast了,reinterpret_cast對於沒有經驗的人是很危險的,所以說,用C的強制型別轉換會產生無法預料的結果。

  • 中秋節和大豐收的關聯?
  • 錯誤的時間遇到了對的人和對的時間遇到了錯誤的人,哪個更不幸?