我收到警告,如警告“C4310:cast truncates constant value”。 相关代码是
short a = 100;
if( a == (short)0x8000 ) ;// Warning is got here.
是什么方法删除警告而不将0x8000作为常量或变量值并且没有类型转换?
如果我将条件行修改为
if( a == (short)-32768 ) ;// No warning seen
为什么会这样?
谢谢。
答案 0 :(得分:2)
警告告诉你一些重要的事情。
假设short
为16位,则有效值为-32768到32767.值0x8000
(32768)超出short
的范围。
使用-32768是有效的,因为它适合short
的范围,实际上在这种情况下不需要强制转换。
答案 1 :(得分:0)
你几乎有两个选择:
使用转换后想要的值写出常量,以便可以省略强制转换:
if( a == -0x8000 )
或
禁用警告,因为它特别阻止您执行您想要执行的操作:使用强制转换作为更改值的运算符。 (除非可能控制评估周围表达式的类型,否则保持值的转换通常是无用的。)
答案 2 :(得分:0)
警告试图向您表达的关键问题是,在您的C实现中,类型short
不能代表值0x8000
。这样的实现并不常见,因为short
具有16位表示是常见的,其中一个是符号位。演员表具有实现定义的行为,很可能不您期望的行为。
此外,如果没有强制转换,则等式比较将始终评估为false,因为short
无法再表示给定值,因此a
的可能值不等于该值。< / p>
您想为a
使用不同的类型。如果您使用的代码类型可以代表0x8000
(unsigned short
而签名和无符号int
将满足该条件),那么您将无需投射。可能还有其他与您应选择的类型相关的注意事项,但您尚未提供任何类型。
答案 3 :(得分:0)
我认为你应该使用unsigned short
所以你可以使用所有的位,因为你不关心标志:
unsigned short a = 100;
if( a == 0x8000 )