#include#include int main(int argc, char *argv[]) { /* * a和b為非負整型變量,檢測a+b是否會“溢出” */ // INT_MAX=2147483647 int a=123456789,b=2147483000; /* 方法一: if(a+b < 0) printf("overflow\n"); 錯誤原因:在某些機器上,加法運算將設置內部寄存器為四種狀態正、負、零和溢出。 在這種機器上c編譯器有理由這樣來檢測 ;a與b相加,然後檢查內部寄存器的相關標志是否 為負,然而當溢出發生時,內部寄存器狀態是溢出而不是負,那麼溢出檢測就會失敗 */ /* * 正確方法為: 法一、將a和b都強制轉換成無符號整數;(原因:因為如果不轉的話兩個數,如果相加結果 是大於INT_MAX的話在放入32寄存器中時是有符號的,符號位被置1了,變成負數,這樣就不可能 大於INT_MAX了,即檢測不出來了) */ #if 1 if((unsigned)a + (unsigned)b > INT_MAX) // (unsigned)必不可少,INT_MAX在limits.h中定義,如果沒有則自己實現 { // INT_MAX=2147483647 printf("overflow\n"); } #else /* 法二、 */ if(a > INT_MAX - b) // 寫成這個形式就可以不用(unsigned)了 { printf("overflow\n"); } #endif return 0; }
輸出: