メインコンテンツ

同一データでのビットごとの演算と算術演算です

ビット演算と算術演算が混在したステートメント

説明

この欠陥は、ビット演算と算術演算が同じ式で実行された場合に発生します。

リスク

ビット演算と算術演算が混在していても、コンパイルは "行われます"。ただし、このような混在した演算の結果には整数型のサイズが影響します。たとえば、特定のビット数の左シフト (<<) に相当する算術演算は、シフトする変数内のビット数に依存するため、そのデータ型の内部表現に依存します。ビット演算と算術演算が混在している場合は、同じ式で別々のターゲットに関する別々の結果が生成される可能性があります。

また、混在した演算は可読性と保守性も低下させます。

修正方法

ビット演算と算術演算を分離するか、各ステートメントにつき 1 種類の演算のみを使用します。

すべて展開する

unsigned int bitwisearithmix()
{
    unsigned int var = 50;
    var += (var << 2) + 1;
    return var;
}

この例では、変数 var にビット演算と算術演算が行われています。var は 2 (ビット) シフトされ、それ自体に 1 が加算 (算術演算) されます。

修正 - 算術演算に限定

この式を算術演算のみに削減できます。var + (var << 2)var * 5 と等価です。

unsigned int bitwisearithmix()
{
    unsigned int var = 50;
    var = var * 5 +1;
    return var;
}

結果情報

グループ: 適切な手法
言語: C | C++
既定値: オフ
コマンド ライン構文: BITWISE_ARITH_MIX
影響度: Low

バージョン履歴

R2016b で導入