繁体   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