在C中键入将常量转换为short int时发出警告

时间:2016-10-25 17:59:29

标签: c casting integer compiler-warnings short

我收到警告,如警告“C4310:cast truncates constant value”。 相关代码是

short a = 100;
if( a == (short)0x8000 ) ;// Warning is got here.

是什么方法删除警告而不将0x8000作为常量或变量值并且没有类型转换?

如果我将条件行修改为

if( a == (short)-32768 ) ;// No warning seen

为什么会这样?

谢谢。

4 个答案:

答案 0 :(得分:2)

警告告诉你一些重要的事情。

假设short为16位,则有效值为-32768到32767.值0x8000(32768)超出short的范围。

使用-32768是有效的,因为它适合short的范围,实际上在这种情况下不需要强制转换。

答案 1 :(得分:0)

你几乎有两个选择:

  1. 使用转换后想要的值写出常量,以便可以省略强制转换:

    if( a == -0x8000 )
    

  2. 禁用警告,因为它特别阻止您执行您想要执行的操作:使用强制转换作为更改值的运算符。 (除非可能控制评估周围表达式的类型,否则保持值的转换通常是无用的。)

答案 2 :(得分:0)

警告试图向您表达的关键问题是,在您的C实现中,类型short不能代表值0x8000。这样的实现并不常见,因为short具有16位表示是常见的,其中一个是符号位。演员表具有实现定义的行为,很可能您期望的行为。

此外,如果没有强制转换,则等式比较将始终评估为false,因为short无法再表示给定值,因此a的可能值不等于该值。< / p>

您想为a使用不同的类型。如果您使用的代码类型可以代表0x8000unsigned short而签名和无符号int将满足该条件),那么您将无需投射。可能还有其他与您应选择的类型相关的注意事项,但您尚未提供任何类型。

答案 3 :(得分:0)

我认为你应该使用unsigned short所以你可以使用所有的位,因为你不关心标志:

unsigned short a = 100;
if( a == 0x8000 )