从 int16 到 unsigned int16 的转换可能会溢出

Conversion from int16 to unsigned int16 may overflow

Polyspace 代码检查后我得到 "conversion from int16 to unsigned int16 may overflow"。

uint16 lData = 0x00u;
sint16 AnalogInputValue;
lData = (uint16)AnalogInputValue; => This line causes Polyspace error

类型转换应该完成这项工作吗?根据 Polyspace 没有 :)

在将其类型转换为 uint16 之前,您首先需要确保 AnalogInputValue 不包含任何负数。如果您不这样做,那么您可能会丢失类型转换中的数据。

下面两行做同样的事情:

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 它应该做出这个假设。