//overflow.c -- by tsaiwn@csie.nctu.edu.tw #include int main( ) { //try this: int a, b, i; a = 32765; b = -32765; for(i=1; i<=9; ++i) { printf(" a= %hd, b= %hd\n", a, b); a++; b--; } printf("use %%hu: "); printf(" a= %hu, b= %hu\n", a, b); printf(" use %%hu -1= %hu\n", -1); printf(" use %%u -1= %u\n", -1); } /*** a= 32765, b= -32765 a= 32766, b= -32766 a= 32767, b= -32767 a= -32768, b= -32768 a= -32767, b= 32767 a= -32766, b= 32766 a= -32765, b= 32765 a= -32764, b= 32764 a= -32763, b= 32763 use %hu: a= 32774, b= 32762 use %hu -1= 65535 use %u -1= 4294967295 本週除了繼續之前作業, 記得我們說過電腦只能處理整數與實數嗎? 請 弄清楚 Overflow (溢位) 以及 Underflow (虧失) 整數 Oveflow, 實數 Overflow? (char 是一種整數) 絕對值太大以致於放不下就是 Overflow //try this: int a, b, i; a = 32765; b = -32765; for(i=1; i<=9; ++i) { printf(" a= %hd, b= %hd\n", a, b); a++; b--; } 0111111111111111 = 32767 + 1 ------------------------------ 1000000000000000 = -32768 Underflow (虧失) 絕對值太小小到幾乎是 0 以致於被電腦當作 0: 整數不會 Underflow, 因為 1 再小就變 0 實數才會 underflow: 0.0000000000...000001 // try this: float a, b; int i; a = 1.0, b= 1.0; for(i=1; i<=123; ++i) { a = a*2; b = b / 2; } for(i=1; i<= 52; ++i) { a = a*2; // 會 overflow b = b / 2; // 會 underflow printf("a=%.8f, b=%.8f", a, b); } ***************************/