説明
小さい整数型をそのビット幅以上シフトすると、Goのシフトと整数変換の規則に従って計算されますが、意図した値と異なる結果になる場合があります。実際の影響は、結果をマスク、サイズ、その他の計算にどう使うかによって異なります。
想定される影響
- マスク、フラグ、サイズの計算を誤り、意図しない動作につながる可能性があります。
- 定数を使った計算の問題はコードレビューで見落とされることがあります。
対処方法
- シフトするビット数と左オペランドの型のビット幅を確認してください。
- 必要なら先に大きい整数型へ変換し、入力値と計算結果の範囲も検証してください。
例
変更前
go
value := int32(n) << 40
変更後
go
value := int64(n) << 40
解説:
- 変更前: 32ビット整数を32ビット以上シフトすると、意図した64ビットの計算と異なる結果になる場合があります。
- 変更後: 先に
int64へ変換し、大きい型で40ビットのシフトを行います。入力値と最終結果がその型の範囲内に収まることも確認する必要があります。