1

私の現在の 32 ビット アプリケーションでは、64 ビット整数で演算を行うことにより、オーバーフローを (ごくたまに) チェックしています。

ただし、64 ビット システムでは、標準の 128 ビット整数はないようです。オーバーフローをチェックする簡単な方法、またはすべての OS とコンパイラで機能する 128 ビット整数を取得する方法はありますか?

より一般的なソリューションとして GMP を使用してみましたが、要件に対して少し重いです。

効率はそれほど重要ではありません。プロセッサ固有の ASM は重要ではありません。

4

3 に答える 3

3

この質問の議論の多くが当てはまります。

整数オーバーフローを検出するには?

32 ビット オーバーフロー チェッキングに使用される手法の多くは、64 ビットにも適用されます (ここで説明する手法のすべてが、次に大きな整数型を使用してオーバーフローを処理するわけではありません)。

于 2008-10-15T13:34:44.437 に答える
2

このドキュメントでは、(c で) オーバーフローをキャッチする方法について詳しく説明しています。C++ でこれを行うより良い方法があるかどうかはわかりません。

于 2008-10-15T13:09:14.957 に答える
1

1 つの解決策は、演算を実行する前にチェックする算術演算子をオーバーライドする 64 ビット int の周りにクラスを作成することです。

私は頭のてっぺんから operatorX 構文を思い出せません (私はずっと前に C++ から Java に切り替えました) が、サンプルは次のようになります。

int64 myint64::add (int64 a, int64 b) {
    if (MAX_INT64 - a > b) {
        // error condition here.
    }
    return a + b;
}
int64 myint64::mul (int64 a, int64 b) {
    if (MAX_INT64 / a > b) {
        // error condition here.
    }
    return a * b;
}

他の算術演算でも同様ですが、累乗や階乗などの非基本関数では非常に複雑になる可能性があります。

ただし、基本的な算術ビルディング ブロックからそれらを構築すると、機能します。

于 2008-10-15T13:59:29.067 に答える