關於隱式類型轉換的this tutorial中的最後一個示例指出std::cout << 5u - 10;
將生成4294967291
而不是-5
由於類型轉換。 我在C和C++都試過這個。在C++中的結果是承諾的,但是當使用C(printf("%d\n", 5u - 10);
)時,結果是-5
。 發生了什麼?C和C++之間的類型轉換差異?
回答
在C示例中沒有任何類型轉換。 C只是評估表達式5u - 10
並將結果推送到堆棧中。然後printf會看到一個類型字符,並在打印時解釋棧上的值。類型字符是d
(%d
)意思是「十進制整數」,因此堆棧中的位置作爲int檢索並打印爲(有符號)十進制。
如果類型字符是ld
(%ld
),堆棧上的位置將被檢索爲一個long,即使只有一個int被推入,並且將打印爲(有符號)十進制數字。再次,沒有任何類型轉換(只會有一個無意義的數字打印)。
有一點更多的想法帶來了認識到問題與printf
而不是轉換本身。 請注意,所寫的內容是printf("%d")
。這表演又一轉換回signed int
,這就是爲什麼我看到-5
的結果。
當使用printf("%u")
進行測試時,顯示承諾結果(4294967291
)。
爲了將其封閉,printf("%X")
導致FFFFFFFB
這意味着這兩個值,這取決於簽名或未簽名的解釋。
我認爲你的意思是「又一次轉換回* signed * int 「 –
謝謝。上面編輯 – levengli
'printf'不執行基於格式說明符的轉換。它假定數據是正確的類型,否則會導致未定義的行爲。 – juanchopanza
- 1. C#鑄造類型之間的差異
- 2. '//'和'///'之間的C++差異
- 3. C和C++之間的鏈接差異?
- 4. 使用相同庫的C#和F#之間的轉換差異
- 5. C++中的類型之間的轉換
- 6. 轉換數據類型之間的C#
- 7. C和C++中的類之間的差異
- 8. JAVA和C#之間的LdapConnection差異
- 9. c#和java之間的差異寫()
- 10. C中#pragma和_Pragma()之間的差異
- 11. C++:0和0.0之間的差異?
- 12. C mmap和numpy memmap之間的差異
- 13. }之間的差異;和}在C++
- 14. C#和Java之間的Base64差異
- 15. C#和java之間的輸出差異
- 16. Objective-C該類的類和實例之間的差異
- 17. 差異在C和Java之間鏈表
- 18. C++之間的差異無符號整型和unsigned long int類型
- 19. 找到時間之間的差異c
- 20. 在C++中託管和非託管類型之間的轉換?
- 21. 在VS2008和IIS6之間有不同的C#類型轉換
- 22. 谷歌分析和實際轉換之間的轉換差異
- 23. 顯式轉換和安全轉換之間的差異#
- 24. C類型轉換和malloc?
- 25. C++ - 幫助理解功能和類模板之間的差異
- 26. 類型轉換和類型轉換之間的區別?
- 27. 強類型和弱類型語言之間測試的差異
- 28. [數據類型]和[數據類型[]]之間的差異
- 29. C++這個和類::之間級差
- 30. C和C++之間的細微差別
C不是類型安全的,因此[使用錯誤的格式字符串調用未定義的行爲](http://stackoverflow.com/q/14504148/995714) –