溢れたかを確かめる

C言語でint aとint bの足した結果がintから溢れているかどうかを調べる処理を書くのに少し苦労しました。a×bが溢れているかどうかはもっと苦労しました。intもunsignedだったらもう少し簡単なんだけどsignedは場合分けが多すぎです。これはきっと世の中に優秀なロジックが転がっているに違いないと思いましたが、上手く検索できないのでゴーリゴリと書いたわけです。ああ、車輪の再発明の極み。

status = CALC_EXECUTE_SUCCESS;
if (((num1 > 0 && num2 > 0) && (num1 > INT_MAX - num2)) ||
    ((num1 < 0 && num2 < 0) && (num1 < INT_MIN - num2))) {
    status = CALC_EXECUTE_OVERFLOW;
}
result = num1 + num2;

減算と除算のサンプルコードは華麗にスルーして、除算が一番簡単です。

status = CALC_EXECUTE_SUCCESS;
if (num1 == INT_MIN && num2 == -1) {
    status = CALC_EXECUTE_OVERFLOW;
}
result = num1 / num2;

ていうか会社の仕事が手から溢れ気味です。困る。

コメントを残す