【问题标题】:Good practice to #define an unsigned bitwise macro flag#define 无符号位宏标志的良好做法
【发布时间】:2018-03-05 15:00:51
【问题描述】:

我知道按位运算只能对无符号整数进行,静态分析器会警告我这一点。

#define 位宏标志的最佳做法是什么? 到目前为止,我看到了这两种方式:

#define MACRO_FLAG1 (1U << 0U)
#define MACRO_FLAG2 (unsigned int)(1 << 1)

【问题讨论】:

  • 正如 StoryTeller 在他的回答中所说,第一个更好。但是你不需要强制移位量是无符号的,所以(1U &lt;&lt; 0) 非常好。移位运算符右侧参数的类型无关紧要 - 它只需要是整数类型即可。
  • 是的,我也认为(1U &lt;&lt; 0) 很好,但似乎clang-tidy 的hicpp-signed-bitwise 在我输入0U 之前不会静音。
  • the second one suffers from UB 如果值转移到符号位,第一个简单地换行丢弃高位

标签: c bit-manipulation


【解决方案1】:

第一个宏用无符号整数表示移位,结果本身是无符号的。

第二个使用带符号整数进行移位,然后转换带符号的结果。它受制于您提到听到的相同弱点。

值得注意的是,静态分析器会警告您可能的问题。根据您的标志范围,即使您使用有符号整数,您也可能永远不会遇到上述问题。

【讨论】:

  • 感谢您的回复,我知道每一行的作用,我的问题是是否有关于如何定义此类无符号标志的一般良好做法。我尝试让我的代码无警告(编译器和静态分析器):)
  • @Taw - 好的做法,而不是什么?请参阅How to Ask,以免对您的问题产生误解。
  • @Taw 我想你不知道。第二个定义是错误的。您移动 signed 整数并且您的演员隐藏了问题。我不知道错误的代码是好是坏。
猜你喜欢
  • 1970-01-01
  • 2010-11-11
  • 2011-12-17
  • 1970-01-01
  • 2016-04-29
  • 2023-03-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多