2
    int isOverflow(uint a, uint b) {
        // a and b are unsigned non-zero integers.
        uint c = a * b;

        if (c < ( a > b ? a : b))
                return 1;
        else
                return 0;
}

何か不足していますか?上記のスニペットが機能すると思います。

編集:私は、大きな数の乗算、オーバーフローをキャッチする方法など、いくつかの派手な方法を使用してチェックする他のソリューションを見てきました。しかし、上記の単純な解決策も正しいように見えます。それが私がこの質問をしている理由です。

4

2 に答える 2

3

例外を見つけることで、これが間違っていることを証明するのは簡単です:

次の 2 つの 8 ビット符号なし値を考えてみましょう:a = 0x1Fb = 0xF.

c = a * b
c = 0x1F * 0xF
c = 0xD1              (Overflow! The real answer is 0x1D1)

c < ( a > b ? a : b)
0xD1 < 0x1F           => False  (Wrong!)

正解はこちら

于 2013-11-11T12:02:47.373 に答える