【问题标题】:Bitwise shift ( varUint8 >> 7) & 0x01u - Misra complient按位移位 ( car Uint8 >> 7) & 0x01u - 符合 Misra
【发布时间】:2019-04-12 12:05:05
【问题描述】:

我正在对一些代码进行故障排除,我遇到了这一行

uint8var = ((constUint8[0]) >> 7) & 0x01u;

我想知道正确的做法是什么。考虑到我将 uint8 向右移动 7 位,在编写符合 MISRA 的代码时,& 0x01u 是否是正确实施所必需的?

【问题讨论】:

  • 我不明白你关心的是什么。你能详细说明一下吗?
  • 我不知道这是否是一个正确的做法,虽然& 1 会更易读IMO,如果constUint8[0] 是8 位,整个操作是多余的。
  • 我的编译器将(x >> 7) & 0x01x >> 7!!(x & 0x80)(其中x 是一个无符号字符)转换为相同的指令...如有疑问,请检查程序集。跨度>
  • @Shawn:检查汇编代码并不能回答有关此代码是否符合 MISRA 规则的问题。 MISRA 关注源代码是否会在所有适用的 C 实现下产生所需的结果。一种实现在一种情况下产生所需结果的事实并不能证明所需的属性。
  • 变量有哪些类型,uint8_t?

标签: c embedded misra


【解决方案1】:

右移 uint8_t 本身永远不会有问题。但是,MISRA-C 旨在阻止您编写由隐式整数提升引起的错误。在您的情况下,constUint8[0] 将被隐式提升为已签名的int。这将导致各种 MISRA 合规性问题,通过首先确保您的代码不包含隐式促销,最容易避免这些问题。

对于移位,这意味着在移位之前转换为大整数类型:
(uint32_t)constUint8[0] >> 7

带有0x01u 的掩码是多余的,没有任何价值。它可以安全地移除。 要实现 MISRA-C 合规性,最好的方法是像这样重写代码:

uint8var = (uint8_t) ((uint32_t)constUint8[0] >> 7);

(uint8_t) 强制转换确保没有隐式转换,但我们明确地返回到预期的类型。 MISRA-C 不允许从较大类型到较小类型的隐式赋值。

欲了解更多信息,请参阅Implicit type promotion rules

【讨论】:

  • 为什么 MISRA-C 接受转换为 uint32_t 足以避免提升为有符号整数?我很好奇它所做的假设,或者它约束自己的环境。
  • @EricPostpischil 它没有,我只是假设这是一台真实世界的计算机,其中 int 是 16 位或 32 位。
猜你喜欢
  • 2012-02-26
  • 1970-01-01
  • 1970-01-01
  • 2015-12-23
  • 1970-01-01
  • 2020-09-25
  • 1970-01-01
  • 1970-01-01
  • 2012-11-12
相关资源
最近更新 更多