次のCスニペットでは、16ビットシーケンスの最初の2ビットが設定されているかどうかを確認します。
bool is_pointer(unsigned short int sequence) {
return (sequence >> 14) == 3;
}
CLionのClang-Tidyから「符号付き整数オペランドと2進ビット演算子を使用する」という警告が表示されますが、その理由はわかりません。 unsigned short
十分な署名がありませんか?
このチェックのコード は、ビット単位演算子のeitherオペランドが署名されているかどうかを気にするようです。警告を引き起こすsequence
ではなく、14
であり、u
を末尾に追加することで14
を無署名にすることで問題を軽減できます。
(sequence >> 14u)
ここで整数の昇格により警告が発生すると思います。整数より小さい整数は、符号付きの算術式の整数に拡張されます。したがって、あなたのコードは事実上return ( (int)sequence >> 14)==3;
であり、警告につながります。 return ( (unsigned)sequence >> 14)==3;
またはreturn (sequence & 0xC000)==0xC000;
を試してください。