【发布时间】:2016-04-04 12:37:04
【问题描述】:
分析以下代码时出现以下 MISRA 违规:
#define z (USHORT)14745
#define Convert(x) ((((USHORT)x*(unsigned short)1000) + ((z) / (USHORT)2)) /(z))
static const USHORT array [2] =
{
Convert(176), -> Line "1"
Convert(206) -> Line "2"
};
在“1”、“2”两行都检测到以下 MISRA 违规:
积分提升:unsigned short 提升为 unsigned int。 参考 - ISO:C90-6.2.1.1 字符和整数
常量:无符号算术运算中的回绕。 MISRA-C:2004 规则 12.11;参考 - ISO:C90-6.1.2.5 类型
此强制转换的结果被隐式转换为另一种类型。
我的问题是:为什么在这个操作中会有一个环绕?!
注意:当我使用调试器检查array 的值时:
array [2] =
{
12,
14
}
哪些是正确的值。
【问题讨论】:
-
因为
176000和206000都超过了USHORT可以容纳的值。 -
凌乱的“转换”行应该是什么?宏的一部分?据我所知,它不是有效的 C。
-
@Vane,但是最后的结果是正确的,为什么?!
-
@Lundin,检查最后的编辑
-
规则 12.11 是建议性的。假设您在转换中“幸运”,并且有规则可以防止您“不幸”..