经过Polyspace代码检查后,我得到“从int16到未签名的int16的转换可能溢出”。
finished
应该类型转换做的工作?根据Polyspace NO:)
答案 0 :(得分:0)
在将类型输入强制转换为uint16之前,您首先需要确保AnalogInputValue不包含任何负数。如果这样做,则可能会丢失类型转换中的数据。
答案 1 :(得分:0)
以下两行内容相同:
lData = AnalogInputValue;
lData = (uint16)AnalogInputValue;
为什么?赋值lData
的目标类型为uint16
,因此在两种情况下都必须将存储在变量AnalogInputValue
中的值转换为uint16
。但是,变量AnalogInputValue
的类型为sint16
。
警告来自以下事实:类型uint16
的变量可以保存范围为0..65535的值。但是,类型sint16
的变量通常可以保存-32768..32767范围内的值。因此,如果AnalogInputValue
的值恰好在-32768 ..- 1范围内,则该值不能用uint16
表示。
因此,在执行分配之前,您可以在其周围添加一些代码来检查AnalogInputValue
是否为负数。这意味着,它拥有一个从0..32767开始的值。所有这些值都可以用uint16
表示。而且,对于另一种情况,即检查发现AnalogInputValue
恰好是负数,您必须找到一些可接受的解决方案。
这里有一种可能的第三种情况:您100%确保AnalogInputValue
永远不会保持负值,但是逻辑太复杂了,以至于Polyspace不能推论这一事实,或者数据来自外部来源(这里似乎是这种情况,因为该值称为AnalogInputValue
)。然后,在赋值之前添加一个断言可以用作指示Polyspace做出此假设的一种方法。