Polyspace代码检查后我收到“从INT16到无符号INT16可能溢出的转换”。
uint16 lData = 0x00u;
sint16 AnalogInputValue;
lData = (uint16)AnalogInputValue; => This line causes Polyspace error
如果该类型转换做的工作?据Polyspace没有:)
首先,您需要确保AnalogInputValue不包含任何负数键入强制转换为UINT16之前。如果你这样做OT这样做,那么你的风险在类型转换丢失数据。
下面两行做同样的事情:
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它应当作出这种假设的一种手段。