#1 什么是溢出
當前計算機采用2補碼方式編碼數字,以8位為例,表達的全部數值范圍為 -128 -- 127。
正數符號位為0,負數符號位為1。
1000 0000表示 -128,快速計算方式是將其當作無符號數 128,然后減去 2^8, 全部過程為 128 - 256 = -128。
或者反碼后加一,同樣為 1000 0000 ,即128,當然是 -128。
溢出也就是數值逾越了當前數值表表達范圍。例如 138 不在 -128 -- 127范圍內。
#2 加法運算中的簡單補救措施
例如 120 + 121,120和121都是正常范圍內可以表達的數字,但其和 241 屬於溢出。
再如 -120 -121,結果同為溢出。
第一種情況的處理: 強制類型轉換為對應無符號數即可。
第二種情況的處理: 先使用neg指令,在輸出時在結果前加負號,可得正確結果。 neg 等效於先取反再加1
#3 如何判斷: 操作數同號 && 操作數與結果不同號
#4 范例與截圖
1 #include <stdio.h>
2 typedef signed char INT8;
3
4 int main(){
5 INT8 m = 120;
6 INT8 n = 121;
7 INT8 r = m + n;
8 printf( " %u\n ", (unsigned char)r);
9
10 m = - 120;
11 n = - 121;
12 r = m + n;
13 _asm{
14 neg r
15 }
16 printf( " -%u\n ", (unsigned char)r);
17
18 getchar();
19 return 0;
20 }
2 typedef signed char INT8;
3
4 int main(){
5 INT8 m = 120;
6 INT8 n = 121;
7 INT8 r = m + n;
8 printf( " %u\n ", (unsigned char)r);
9
10 m = - 120;
11 n = - 121;
12 r = m + n;
13 _asm{
14 neg r
15 }
16 printf( " -%u\n ", (unsigned char)r);
17
18 getchar();
19 return 0;
20 }
結果:
241
-241