Go での整数オーバーフローの検出
整数オーバーフローは、算術演算の結果がデータ型で表現できる最大値または最小値を超えると発生します。 。 Go では、整数は符号付き整数または符号なし整数を使用して表され、32 ビットと 64 ビットが最も一般的です。
整数のオーバーフローを検出する「正しい」方法は、結果を最大値または符号なし整数と比較することです。データ型の最小値。たとえば、32 ビット加算の場合、2 つの正の整数の合計が最大値 (2^31 - 1) を超える場合、または 2 つの負の整数の合計が最小値 (-2^31) より小さい場合、オーバーフローが発生します。
次のコードを考えてみましょう:
a, b := 2147483647, 2147483647 // 32-bit integers c := a + b
c がオーバーフローしたかどうかを確認するには、それを最大 32 ビット整数と比較できます:
if c > math.MaxInt32 { // Integer overflow occurred }
同様に、 64 ビット加算では、2 つの正の整数の合計が最大値 (2^63 - 1) を超える場合、または 2 つの負の整数の合計が最小値 (-2^63) より小さい場合にオーバーフローが発生します。チェックは次のようになります:
if c > math.MaxInt64 { // Integer overflow occurred }
別のアプローチは、カスタム エラー処理を使用することです。エラー変数を定義し、オーバーフローがない場合は nil に設定できます:
var errOverflow error if right > 0 { if left > math.MaxInt32-right { errOverflow = errors.New("integer overflow") } } else { if left < math.MinInt32-right { errOverflow = errors.New("integer overflow") } }
次に、操作後にエラー変数をチェックできます:
if errOverflow != nil { // Integer overflow occurred }
以上がGoで整数オーバーフローを検出するには?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。