我想知道用C++語言標準像的情況下指定的規則:C++語言標準關於static_cast如何處理減小整數大小的說法是什麼?
long x = 200;
short y = static_cast<short>(x);
是y
保證是200,還是標準的離開這個由實現來決定?各種編譯器如何遵守標準?
我想知道用C++語言標準像的情況下指定的規則:C++語言標準關於static_cast如何處理減小整數大小的說法是什麼?
long x = 200;
short y = static_cast<short>(x);
是y
保證是200,還是標準的離開這個由實現來決定?各種編譯器如何遵守標準?
在這種情況下,static_cast<>
是一種「明確的類型轉換」。該標準對4.7/3「積分轉換」中的積分轉換進行了說明:
如果目標類型是帶符號的,如果它可以用目標類型表示(並且位域寬度);否則,該值是實現定義的。
由於short
保證是能夠保持價值200
(short
必須至少爲16位),然後爲您具體的例子,答案是肯定的。
各種編譯器都堅持這種行爲 - 從C開始前的ANSI日期開始,這種方式就已經這麼做了,很多代碼依賴於編譯器供應商似乎不願意發出關於截斷可能性的警告的行爲。
如果該值落在short
的範圍內,則該值保證是正確的,在您的情況下爲true,因此y == 200
。
如果超出範圍(例如static_cast<short>(1000000000)
),則行爲未定義。大多數編譯器只會將二進制數字截斷爲正確的大小。
未定義的行爲,未指定。 – GManNickG
@GMan:未指定,但實現定義。有一個細微的差別 - 對於定義的實現,有一個特定的行爲,實現需要記錄,這對於未指定的行爲不是必需的。 '未指定'和'未定義'行爲之間的區別在於,對於未指定的行爲通常存在一組允許的行爲,而對於未定義的行爲(包括崩潰)則通常是一組允許的行爲。 –
@邁克爾:很高興知道,謝謝。 – GManNickG