トップC-Tips > 桁あふれ

桁あふれ

一つの数値を表現するために割り当てられた記憶容量は決まっているため、 扱える数値には上限がある。 数値演算を行った結果がこの上限を超えるのが桁あふれオーバーフロー)である。 例えば、16ビットの符号付き整数は、-32768 から 32767 までの整数を扱うことができる。 ある演算を行った結果が32767を超えたら、 16ビット符号付き整数の枠内では扱うことができないため、桁あふれとなる。

次のプログラム

#include <stdio.h>

int main() {
    int a, b, c;	// 32ビット
    a = 50100;
    b = 85000;
    c = a * b / 10000;
    printf("a=%d, b=%d, c=%d\n",a, b, c);
}
をコンパイル実行した結果は TCC でも gcc でも
a=50100, b=85000, c=-3646
である。なぜならば、a * b を計算した段階で桁あふれがおこるからである。 この場合は、c の計算式を
    c = a / 100 * b / 100;
とすれば、
a=50100, b=85000, c=425850
となり、所望の結果が得られる。 しかし、整数演算では剰余の切り捨てがあるため、 掛け算を先に、割り算を後から行う方が誤差は小さい。 例えば、5 * 4 / 3 は 6 、5 / 3 * 4 は 4 となる。