2010-02-11 15 views

回答

9

在這種情況下,static_cast<>是一種「明確的類型轉換」。該標準對4.7/3「積分轉換」中的積分轉換進行了說明:

如果目標類型是帶符號的,如果它可以用目標類型表示(並且位域寬度);否則,該值是實現定義的。

由於short保證是能夠保持價值200short必須至少爲16位),然後爲您具體的例子,答案是肯定的。

各種編譯器都堅持這種行爲 - 從C開始前的ANSI日期開始,這種方式就已經這麼做了,很多代碼依賴於編譯器供應商似乎不願意發出關於截斷可能性的警告的行爲。

-2

如果該值落在short的範圍內,則該值保證是正確的,在您的情況下爲true,因此y == 200

如果超出範圍(例如static_cast<short>(1000000000)),則行爲未定義。大多數編譯器只會將二進制數字截斷爲正確的大小。

+0

未定義的行爲,未指定。 – GManNickG

+4

@GMan:未指定,但實現定義。有一個細微的差別 - 對於定義的實現,有一個特定的行爲,實現需要記錄,這對於未指定的行爲不是必需的。 '未指定'和'未定義'行爲之間的區別在於,對於未指定的行爲通常存在一組允許的行爲,而對於未定義的行爲(包括崩潰)則通常是一組允許的行爲。 –

+0

@邁克爾:很高興知道,謝謝。 – GManNickG

相關問題