使用 Misra 检查某些代码时,它生成了以下消息
Unpermitted operand to operator '>>' [MISRA 2012 Rule 10.1 required]
Unpermitted operand to operator '&' [MISRA 2012 Rule 10.1 required]
Run Code Online (Sandbox Code Playgroud)
我无法理解这个问题,而且规则 10.1 的描述非常笼统,没有多大帮助。相关代码如下。
float variable2;
variable2= 814.00f;
Data[0] = (((Int16) variable2) >> 8) & ((Int16)0xFF);
Data[1] = ((Int16) variable2) & ((Int16)0xFF);
Run Code Online (Sandbox Code Playgroud)
这段代码中使用运算符有什么问题?
您永远不应该在按位算术中使用有符号整数。有很多与之相关的定义不明确的行为。左移负值会产生未定义的行为。右移负值会给出实现定义的行为(算术或逻辑移位)。
因此,MISRA-C 要求所有此类变量都应属于他们所谓的本质上无符号类型。
此外,无论有符号性如何,使用 16 位类型在 32 位系统上都是不安全的,因为它们将隐式提升为 32 位有符号int。我假设您使用的是 32 位系统,否则使用浮点数可能一开始就没有意义。
在您的情况下,您不能直接从浮点变为无符号,因为您会丢失符号位。这意味着您必须先一步进行签名输入。
float f32 = 814.00f;
int32_t s32 = (int32_t)f32;
uint32_t u32 = (uint32_t)s32;
Data[0] = ((u32 >> 8) & 0xFFu);
Data[1] = (u32 & 0xFFu);
Run Code Online (Sandbox Code Playgroud)
这应该符合 MISRA-C 标准,尽管这也取决于类型Data。
u整数常量的后缀就足够了,您不需要对它们进行强制转换。&建议性 MISRA-C:2012 12.1 需要在操作数周围添加额外的括号。您的代码不符合此规则,上面的代码符合。