4

C の符号付きオーバーフローは標準では未定義の動作であることは知っていますが、実際には符号付き整数に 2 の補数を使用することは非常に一般的であるため (たとえば-fwrapv、gcc のオプションを使用して許可されていることもあります)、この事実をうまく利用したプログラムの例のリスト。

「ときどきオーバーフローするカウンターをインクリメントする」などのプログラムは、符号なし整数の方が適しているように思われるため、カウントしないと思います。

また、この場合に有効にできるコンパイラの最適化は考慮していませんが、実際に符号付きオーバーフローを使用して何か興味深いものを計算する便利なプログラム.

4

2 に答える 2

3

整数オーバーフローを使用して、32 ビット CPU で 64 ビット演算を実装しました (C および C++ では、1980 年代にさかのぼります)。頭のてっぺんから、次のようにコーディングされていたと思います。

// Add two-word integers
void add64(unsigned a[2], unsigned b[2])
{
    unsigned    t;

    // Add two-word integer b to a
    t = a[1];
    a[1] += b[1];    // Lower word
    if (a[1] < t)    // True if a[1]+b[1] overflows
        a[0]++;      // Upper word
}

確かに、これは符号付き整数オーバーフローを使用していませんが、オーバーフローを検出して最終結果を調整するという同じ原則に基づいて、実際にはこれらのルーチンの符号付き整数形式もあったと思います。(現時点では詳細を思い出すことはできません。) 私が覚えているように、ほとんどのルーチンは実際には C プリプロセッサ マクロとしてコーディングされていました。

于 2013-07-03T23:15:17.670 に答える