目錄

廣告 AD

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

有時候在做簡單加減乘除的時候

計算結果超出由於當前型態的範圍

而導致計算結果錯誤的問題

這邊簡單紀錄了幾個如何偵測這種問題的方法

廣告 AD

檢查整數加法:

分別可能產生 integer overflow 和 integer underflow

C

#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

C

#include <limits.h>

unsigned a, b;
unsigned c = a + b;
if(a > 0 && b > UINT_MAX - a)  // integer overflow

整數加法:

一樣可能產生 integer overflow 和 integer underflow

C

#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

檢測方法只要比較 ab 的大小即可

C

unsigned a, b;
unsigned c = a - b;
if(b > a)  // integer underflow

乘法的溢出檢測則是依靠除法來檢測:

$$C = A \times B \Rightarrow C \div A = B$$

另外為了處理除以 0 的問題,多了個判斷式

畢竟如果任一數字為 0 ,一定不會溢出

C

int a, b;
int c = a * b;
if(a != 0 && c / a != b)  // integer overflow

廣告 AD