[英]Warning when type casting a constant to short int in C
我收到類似此警告的警告“ C4310:強制截斷常量值”。 關聯的代碼是
short a = 100;
if( a == (short)0x8000 ) ;// Warning is got here.
在不將0x8000設為常量或變量值且不進行類型轉換a的情況下,刪除警告的方法是什么?
如果我將條件行修改為
if( a == (short)-32768 ) ;// No warning seen
為什么是這樣?
謝謝。
警告告訴您一些重要信息。
假設short
為16位,則有效值為-32768到32767。值0x8000
(32768)超出short
的范圍。
使用-32768是可行的,因為它適合在short
的范圍內,實際上在這種情況下不需要強制轉換。
您幾乎有兩個選擇:
用轉換后想要的常量寫入常量,以便可以省略強制類型轉換:
if( a == -0x8000 )
要么,
禁用警告,因為它特別阻止您執行自己想做的事情:使用強制轉換作為更改值的運算符。 (保留值的強制轉換通常是無用的,除非可以控制評估周圍表達式的類型。)
警告試圖向您表達的關鍵問題是,在您的C實現中,鍵入short
不能表示值0x8000
。 這樣的實現一點都不罕見,因為short
通常具有16位表示,其中一個是符號位。 強制轉換具有實現定義的行為,很可能不是您期望的行為。
此外,沒有投,平等的比較結果將總是為假,因為,再次, short
不能代表給定值,所以沒有可能值a
等於價值。
你想使用不同類型的a
。 如果使用可以表示0x8000
的類型( unsigned short
,signed和unsigned int
都滿足該條件),則無需強制轉換。 您可能還需要考慮與應該選擇哪種類型相關的其他注意事項,但是您還沒有提出任何建議。
我認為您應該使用unsigned short
這樣您就可以使用所有位,因為您不必關心符號:
unsigned short a = 100;
if( a == 0x8000 )
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.