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