程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> 程序猿之---C語言細節7

程序猿之---C語言細節7

編輯:關於C語言

程序猿之---C語言細節7


主要內容:檢測兩個整型相加是否溢出

#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;
}

輸出:


  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved