我正在尝试更正使用以下代码发生的 MISRA 违规“441 - float 转换为非 float ”:
tULong frames = (tULong)(runTimeSeconds * 40.0f);
runTimeSeconds
是一个float
,显然 40.0f
被指定为一个float
。有什么想法吗?
最佳答案
有一条规则 (MISRA-C:2004 10.4) 说明浮点类型的复杂表达式的值只能转换为更窄的浮点类型。
(runTimeSeconds * 40.0f)
就是这样一个所谓的复杂表达式(MISRA-C:2004 术语)。为了避免违反 MISRA,您可以引入一个临时变量:
float tmp = runTimeSeconds * 40.0f;
tULong frames = (tULong)tmp; // no complex expression, this is fine
这条规则的基本原理是复杂的表达式可能包含隐式类型提升和类似的危险事物。
MISRA-C:2004 也担心/偏执于认为更改代码如 uint8_t u8a, u8b; 的无能程序员; ... u8a + u8b
到 (uint32_t)(u8a + u8b)
会以某种方式导致加法作为无符号 32 位类型执行。
这些规则在 MISRA-C:2012 中得到了改进,并且在那里更加合理。根据 MISRA-C:2012 10.5,从浮点表达式到无符号表达式的转换没问题。
关于c - MISRA 违规 "441 - Float cast to non-float ",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41578027/