c - 按位移位 (varUint8 >> 7) & 0x01u - Misra 兼容
问题描述
我正在对一些代码进行故障排除,我遇到了这一行
uint8var = ((constUint8[0]) >> 7) & 0x01u;
我想知道正确的做法是什么。& 0x01u
考虑到我将 uint8 向右移动 7 位,在编写符合 MISRA 的代码时是否需要正确实施?
解决方案
右移 auint8_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 不允许从较大类型到较小类型的隐式赋值。
有关详细信息,请参阅隐式类型提升规则。
推荐阅读
- xamarin.forms - 渐变作为按钮边框颜色?
- javascript - javascript将数组添加到数组中的特定索引
- php - Google Indexing API - 403 '禁止响应'
- c# - 无法从 DLL 读取 App.config
- javascript - 如何覆盖对象中的 javascript IIFE 返回方法?
- javascript - 使用 javascript 扩展更改 chrome 中的语言
- google-maps - 通过 ShapeFiles 将 Google Maps/Fusion Tables 导入 PowerBI
- python-2.7 - 列表理解通过在另一个数据框中查找列值来更新数据框
- html - 我可以通过 HTML5 中的按钮临时切换 novalidate 以保存表单的当前状态吗
- java - 将变量从 Dialog 传递到 Listview 片段