gpt4 book ai didi

c - 运算符 '>>' 和 '&' 的未经允许的操作数 (MISRA C)

转载 作者:行者123 更新时间:2023-12-03 19:02:03 25 4
gpt4 key购买 nike

用Misra检查一些代码时,产生如下信息

Unpermitted operand to operator '>>' [MISRA 2012 Rule 10.1 required]
Unpermitted operand to operator '&' [MISRA 2012 Rule 10.1 required]

我无法理解这个问题,规则 10.1 的描述非常笼统,没有太大帮助。相关代码如下。

float  variable2;
variable2= 814.00f;
Data[0] = (((Int16) variable2) >> 8) & ((Int16)0xFF);
Data[1] = ((Int16) variable2) & ((Int16)0xFF);

在此代码中使用运算符有什么问题?

最佳答案

永远不要在按位算术中使用有符号整数。有很多与之相关的定义不明确的行为。左移负值会产生未定义的行为。右移负值会产生实现定义的行为(算术或逻辑移位)。

因此 MISRA-C 要求所有这些变量都应该是它们所谓的基本无符号类型。

此外,在 32 位系统上使用 16 位类型而不考虑符号是不安全的,因为它们将被隐式提升为 32 位符号 int。我假设您使用的是 32 位系统,否则使用 float 可能从一开始就毫无意义。

在您的情况下,您不能直接从 float 转到 unsigned,因为您会丢失符号位。这意味着您必须先进行一步到签名类型。

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);

这应该是 MISRA-C 兼容的,尽管它也取决于 Data 的类型。

  • u 整数常量的后缀就足够了,你不需要转换它们。
  • 使用 stdint.h 类型而不是一些自制类型。
  • & 操作数周围的额外括号是 MISRA-C:2012 12.1 公告所必需的。您的代码不符合此规则,上面的代码是。

关于c - 运算符 '>>' 和 '&' 的未经允许的操作数 (MISRA C),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55041721/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com