4

誰かが 2 つの __int64 obj を乗算し、結果が __int64 に収まるかどうかを確認する方法を (詳細に) 説明できますか?

注: コンパイラまたはプロセッサに依存するルーチンは使用しないでください。

4

1 に答える 1

4

仮定せずab肯定的です:

__int64 a,b;
//...
__int64  tmp_result = abs(a) * abs(b) ;
if (
    ( a && b ) &&
    (
     ( tmp_result < abs(a) || tmp_result < abs(b) ) ||
     ( tmp_result / abs(a) != abs(b)) ||
     ( a == TYPE_MIN && b != 1) ||
     ( b == TYPE_MIN && a != 1)
    )
   )
   std::cout << "overflow";
__int64 result = a * b;

編集:コードにコーナーケースを追加します。

編集:私の意見で( a && a * b / a != b)は、ちょうど十分です。

于 2011-04-30T08:24:16.830 に答える