程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> 程序猿之---C語言細節20(符號和有符號之間轉換、兩數相加溢出後數值計算)

程序猿之---C語言細節20(符號和有符號之間轉換、兩數相加溢出後數值計算)

編輯:關於C語言

程序猿之---C語言細節20(符號和有符號之間轉換、兩數相加溢出後數值計算)


主要內容:無符號和有符號之間轉換、兩數相加溢出後數值計算

#include  

/* 這個函數存在潛在漏洞 */
float sum_elements(float a[], unsigned length) 
{
	int i;
	float result = 0;
	
	for(i = 0; i <= length - 1; i++)
	{
		result += a[i];
		printf("a[%d] = %f  \n",i,a[i]); 
	}
	return result;
}
int main()
{
	int i = 200 * 300 * 400 * 500;  // int表示20億左右,無符號就40億左右 
	float j = (3.14 + 1e20) -1e20; // 由於表示精度有限輸出結果為0 ,而這條語句輸出3.14:float j = 3.14 + (1e20 -1e20);
		                       //  e表示10為低的指數    
   	long int a = 1;
    	long long int b =10;

        printf("i = %d\n",i);
	printf("j = %f\n",j);
	printf("a = %ld\n",a);
	printf("b = %ld\n",b);
	printf("\n");
		
	/* 測試補碼*/
	unsigned int u = 4294967295u;
	int tu = (int)u;
	printf("u = %u, tu = %d\n", u, tu);  // 無符號int的最大值和-1的補碼是一樣的(即無符號Umax和-1的補碼相同位表示) 
	printf("\n");// 一個有符號數映射為它相應的無符號數時,負數轉換成大的正數,非負數保持不變 

	/* 測試轉換*/
	short int v = -12345;
	unsigned short uv = (unsigned short) v;  // 強制轉換改變數值,但不改變位表示(即 -12345和無符號53191位一樣) 
	printf("v = %d, uv = %u\n", v, uv);	 
	printf("\n");
		
	float c[3];
	sum_elements(c,3);  // 傳遞0時出錯 ,出現無符號和有符號轉換問題 
	/*小結:表達式中一個數是有符號另一個是無符號,C語言默認轉換為無符號,在比較-1<0U時會有問題 */
	
	/*
		溢出計算,公式見下圖 
	*/
	short a1 = -65536;
	short b1 = -1;
	printf("\n");
	printf("%d\n",a1+b1);
	 
	return 0;
}

溢出公式:

\

輸出:


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