分配给更宽类型的复合表达式值



以下是我无法理解的MISRA C:2012一书的摘录

复合表达式 (+ ,- ,* ,/,&, |, ^, <<,>>, ?:) 的值不应分配给类型更宽的对象。

例:

u32a = u16a + u16b;     //non - compliant to MISRA C guidelines

其中 U16 表示uint16_t,U32 表示uint32_t。

这会导致程序运行期间出现任何问题吗? 我们可能需要使用 U32a,因为在这种情况下 u16a 可能会导致整数溢出?

这是因为你永远不知道编译器将如何处理(u16a + u16b)表达式,因为它可能会考虑在将结果分配给目标变量之前以16位存储结果(考虑嵌入式系统中使用的8位和16位目标)。

你期望(错误地)没有溢出的可能性,而这是绝对可能的。按照MISRA的建议编写作业只会让你清楚地看到溢出的问题。

最新更新