从INT16转换到无符号INT16可能溢出

时间:2019-02-01 12:35:40

标签: type-conversion unsigned signed misra

经过Polyspace代码检查后,我得到“从int16到未签名的int16的转换可能溢出”。

finished

应该类型转换做的工作?根据Polyspace NO:)

2 个答案:

答案 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做出此假设的一种方法。