1

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

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

例子:

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

其中 u16 是 uint16_t,u32 是 uint32_t。

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

4

1 回答 1

3

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

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

于 2013-10-22T11:25:10.130 回答