2015-09-01 77 views
-3

關於隱式類型轉換的this tutorial中的最後一個示例指出std::cout << 5u - 10;將生成4294967291而不是-5由於類型轉換。 我在C和C++都試過這個。在C++中的結果是承諾的,但是當使用C(printf("%d\n", 5u - 10);)時,結果是-5。 發生了什麼?C和C++之間的類型轉換差異?

+1

C不是類型安全的,因此[使用錯誤的格式字符串調用未定義的行爲](http://stackoverflow.com/q/14504148/995714) –

回答

3

在C示例中沒有任何類型轉換。 C只是評估表達式5u - 10並將結果推送到堆棧中。然後printf會看到一個類型字符,並在打印時解釋棧上的值。類型字符是d%d)意思是「十進制整數」,因此堆棧中的位置作爲int檢索並打印爲(有符號)十進制。

如果類型字符是ld%ld),堆棧上的位置將被檢索爲一個long,即使只有一個int被推入,並且將打印爲(有符號)十進制數字。再次,沒有任何類型轉換(只會有一個無意義的數字打印)。

+0

進行整數升級以進行計算。至於'printf',我同意你的看法 - 我說錯了。 – levengli

+0

@levengli,我相信沒有「促銷」,無論是有符號或無符號整數。計算在默認情況下以整數的寬度(有符號或無符號)完成。在常數表達式中,從數字5開始,無論是有符號還是無符號,都會減去數字10。如果解釋爲無符號,則減法「包裝位」併產生一個很大的數字,當解釋爲有符號時則爲-5。 –

+0

執行算術運算時,運算符的兩側需要具有相同的數據類型。 '5u'是'unsigned'而'10'是'signed'(默認)。結果發生整數轉換。請參閱c99規範 – levengli

0

有一點更多的想法帶來了認識到問題與printf而不是轉換本身。 請注意,所寫的內容是printf("%d")。這表演又一轉換回signed int,這就是爲什麼我看到-5的結果。

當使用printf("%u")進行測試時,顯示承諾結果(4294967291)。

爲了將其封閉,printf("%X")導致FFFFFFFB這意味着這兩個值,這取決於簽名或未簽名的解釋。

+2

我認爲你的意思是「又一次轉換回* signed * int 「 –

+0

謝謝。上面編輯 – levengli

+5

'printf'不執行基於格式說明符的轉換。它假定數據是正確的類型,否則會導致未定義的行爲。 – juanchopanza