0

符号付きの 16 ビット幅の変数を使用しています。加算、減算などの場合、次の方法でキャリーとオーバーフローを検出できますか。

結果を 32 ビット幅の変数に格納し、17 番目のビットをチェックします (0 ~ 16 のビットが値を表し、キャリーまたはオーバーフローがある場合、17 番目のビットは 1 である必要があります - オーバーフロー)。1 の場合はオーバーフロー/キャリーであり、0 の場合はそうではありません。16b 値を使用する場合、オーバーフローなしでキャリーが発生することはありますか?

StackOverflow を検索しましたが、私の質問に対する明確な答えを見つけることができませんでした。

4

1 に答える 1

0

upd: 操作を実行するときにオペランドが制限 (limits.h で宣言されている) に対してテストされている場合、アプローチを使用できます。たとえば、この「安全な」加算関数を見てください。

int safe_add(int x, int y)
{
    if(y < 0)
       return save_sub(x, -y);
    if(x > (INT_MAX - y)) 
    {
        printf("overflow\n");
        return INT_MAX;
    }
    return x + y;
}

int save_sub(int x, int y)
{
    if(y < 0)
        return save_add(x, -y);
    if(x > (INT_MIN + y)) 
    {
        printf("underflow\n");
        return INT_MIN;
    }
    return x - y;
}

注: これらのメソッドには少なくとも 1 つのバグがあります。最大の負の整数である INT_MIN で呼び出すと失敗する可能性があります。

于 2014-08-17T13:18:30.197 に答える