gpt4 book ai didi

c - 无符号算术运算的环绕

转载 作者:行者123 更新时间:2023-11-30 15:10:05 25 4
gpt4 key购买 nike

分析以下代码时出现以下 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 违规:

  • 整数提升:无符号短整型提升为无符号整型。引用 - ISO:C90-6.2.1.1 字符和整数

  • 常量:无符号算术运算的环绕。MISRA-C:2004 规则 12.11;引用 - ISO:C90-6.1.2.5 类型

  • 此转换的结果会隐式转换为另一种类型。

我的问题是:为什么这个操作会出现环绕?!

注意:当我使用调试器检查 array 的值时:

array [2] = 
{
12,
14
}

哪些是正确的值。

最佳答案

首先,176 * 1000 不适合 16 位无符号短整型。因此,通过使用 MISRA,您可以防止代码中出现严重错误,因为该算法是根据有符号 int 类型计算的,并且其结果隐式显示回无符号短整型。如果你得到了预期的结果,那完全是巧合/运气。

请注意,还有另外两项 MISRA 违规行为未报告:

  • 不允许使用类似函数的宏(规则 19.7)
  • 您应该使用一组预定义的整数类型定义,例如 stint.h(规则 6.3)

这两条都是非常好的规则,您不应该忽视。 (它还应该警告您使用不带“u”后缀的文字。)

解决方法是用类型安全的函数替换困惑的宏,该函数不包含隐式提升(给定 32 位 int):

uint16_t convert (uint16_t x)
{
const uint16_t z = 14745u;
uint32_t result32;

result32 = (uint32_t)x * 1000ul + (uint32_t)z / 2ul / (uint32_t)z
return (uint16_t)result32;
}

关于c - 无符号算术运算的环绕,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36402869/

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