C/C++ 語言中的數值運算陷阱:Integer Overflow and Underflow

目錄
有時候在做簡單加減乘除的時候
計算結果超出由於當前型態的範圍
而導致計算結果錯誤的問題
這邊簡單紀錄了幾個如何偵測這種問題的方法
Add
檢查整數加法:
分別可能產生 integer overflow 和 integer underflow
#include <limits.h>
int a, b;
int c = a + b;
if(a > 0 && b > INT_MAX - a) // integer overflow
if(a < 0 && b < INT_MIN - a) // integer underflow
如果換成 unsigned,則只會有 integer overflow
#include <limits.h>
unsigned a, b;
unsigned c = a + b;
if(a > 0 && b > UINT_MAX - a) // integer overflow
Subtraction
整數加法:
一樣可能產生 integer overflow 和 integer underflow
#include <limits.h>
int a, b;
int c = a - b;
if(a > 0 && b < a - INT_MAX) // integer overflow
if(a < 0 && b < INT_MIN - a) // integer underflow
如果換成 unsigned,則只會有 integer underflow
檢測方法只要比較 a
和 b
的大小即可
unsigned a, b;
unsigned c = a - b;
if(b > a) // integer underflow
Multiple
乘法的溢出檢測則是依靠除法來檢測:
$$C = A \times B \Rightarrow C \div A = B$$
另外為了處理除以 0 的問題,多了個判斷式
畢竟如果任一數字為 0 ,一定不會溢出
int a, b;
int c = a * b;
if(a != 0 && c / a != b) // integer overflow
Reference
如果你覺得這篇文章有用 可以考慮贊助飲料給大貓咪