web-dev-qa-db-ja.com

「2進ビット演算子での符号付き整数オペランドの使用」-符号なしshortを使用する場合

次のCスニペットでは、16ビットシーケンスの最初の2ビットが設定されているかどうかを確認します。

bool is_pointer(unsigned short int sequence) {
  return (sequence >> 14) == 3;
}

CLionのClang-Tidyから「符号付き整数オペランドと2進ビット演算子を使用する」という警告が表示されますが、その理由はわかりません。 unsigned short十分な署名がありませんか?

27
SakoDaemon

このチェックのコード は、ビット単位演算子のeitherオペランドが署名されているかどうかを気にするようです。警告を引き起こすsequenceではなく、14であり、uを末尾に追加することで14を無署名にすることで問題を軽減できます。

(sequence >> 14u)
36
Ryan Haining

ここで整数の昇格により警告が発生すると思います。整数より小さい整数は、符号付きの算術式の整数に拡張されます。したがって、あなたのコードは事実上return ( (int)sequence >> 14)==3;であり、警告につながります。 return ( (unsigned)sequence >> 14)==3;またはreturn (sequence & 0xC000)==0xC000;を試してください。

8
user5329483