Go で整数オーバーフローを効率的に検出するには?

DDD
リリース: 2024-11-06 18:47:02
オリジナル
261 人が閲覧しました

How to Efficiently Detect Integer Overflow in Go?

Go での整数計算の効率的なオーバーフロー検出

整数を扱うとき、特に Lisp 言語のコンテキストでは、次のような懸念が生じます。整数オーバーフローが発生する可能性があり、不正確な結果が生じる可能性があります。このようなオーバーフローの検出は、計算の正確さを維持するために非常に重要です。

オーバーフローを検出するための一般的なアプローチの 1 つは、演算を実行する前にオペランドをより大きな整数型に変換することです。これによりオーバーフロー検出が保証されますが、基本的な算術演算では非効率的でメモリを大量に消費するプロセスになる可能性があります。

オーバーフロー検出のためのより効率的で正確な手法は、整数加算の数学的特性を利用することです。たとえば、2 つの 32 ビット整数を加算する場合、結果が 32 ビット整数の最大値 (2^31-1) を超えるか、最小値 (-2^31) を下回ると、オーバーフローが発生します。

Go で整数オーバーフローを検出するには、次のコード スニペットを考えてみましょう。

package main

import (
    "errors"
    "fmt"
    "math"
)

var ErrOverflow = errors.New("integer overflow")

func Add32(left, right int32) (int32, error) {
    if right > 0 {
        if left > math.MaxInt32-right { // Check for positive overflow
            return 0, ErrOverflow
        }
    } else {
        if left < math.MinInt32-right { // Check for negative overflow
            return 0, ErrOverflow
        }
    }
    return left + right, nil
}

func main() {
    var a, b int32 = 2147483327, 2147483327
    c, err := Add32(a, b)
    if err != nil {
        // Handle integer overflow
        fmt.Println(err, a, b, c)
    }
}
ログイン後にコピー

このコード スニペットでは、2 つの 32 ビット整数を入力として受け取り、実行前にオーバーフローをチェックするカスタム関数 Add32 を定義します。加算演算。数学的原理を使用して、オーバーフローを示す条件 (結果が最大値を超えるか、最小許容値を下回る場合) を決定します。

オーバーフローが検出された場合、関数はオーバーフローを示すエラーを返します。それ以外の場合は、加算演算の結果を返します。

このコード スニペットを実行すると、次が出力されます:

integer overflow 2147483327 2147483327 0
ログイン後にコピー

これは、2 つの 32 ビット整数を加算するときにオーバーフローが発生したことを示します。また、Add32 関数はエラーを正しく検出して報告しました。このアプローチは、Go で整数オーバーフローを検出する効率的かつ信頼性の高い方法を提供し、計算の正確さを保証します。

以上がGo で整数オーバーフローを効率的に検出するには?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!