gpt4 book ai didi

c - 理解Klocwork按位运算符号

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

当通过klocwork分析时,出现以下行

pTxData[index] =  ( UINT8_C(0) << UINT8_C(4) );

报错

Operand of bitwise operation has type 'signed char' instead of 'unsigned integer'

我已经通过删除任何 #define 将问题降至最低,并且完全不知道为什么会发生这种情况。

最佳答案

对于那些不知道的人,UINT8_C是一个 C 标准宏1),用于获取 uint_least8_t 类型的整数常量而不是默认的 int .

因此UINT8_C(0)相当于 (uint_least8_t)0 。这将是一个小整数类型。因此,当作为左操作数传递给 << 时,它会受到整数提升2)的影响。 。升级后,它最终成为类型 int ,相当于只写 0 .

您永远不应该将带符号的操作数与按位运算符一起使用,因此这是错误消息的核心原因。更正后的代码应类似于 0u << 4 。当然,除了自记录代码之外,这段代码对于任何其他东西来说都是毫无意义的。 (当然,将值移至 0 总是无害的。)

使用UINT8_C<< 的右操作数上毫无意义 - 该操作数不参与结果的任何类型提升。如果您需要使用无符号文字只是为了满足编码标准,请使用 4u 。值得注意的是,像 MISRA-C 这样的标准要求 u后缀,如果您实际上不需要无符号类型 - 这是工具误报的常见来源。

摘要 - 使用此:

pTxData[index] =  0u << 4;

此外,Klockwork 给出了错误的诊断消息。表达式中的运算符可能都相当于 unsigned char绝对不是signed char正如该工具所说。

<小时/>

1) 在 C99 中引入 7.18.4.1

2) 请参阅 Implicit type promotion rules

关于c - 理解Klocwork按位运算符号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54903162/

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