簡體   English   中英

在C中將類型強制轉換為short int時發出警告

[英]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的范圍內,實際上在這種情況下不需要強制轉換。

您幾乎有兩個選擇:

  1. 用轉換后想要的常量寫入常量,以便可以省略強制類型轉換:

     if( a == -0x8000 ) 

    要么,

  2. 禁用警告,因為它特別阻止您執行自己想做的事情:使用強制轉換作為更改值的運算符。 (保留值的強制轉換通常是無用的,除非可以控制評估周圍表達式的類型。)

警告試圖向您表達的關鍵問題是,在您的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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM