#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