关于C有符号数数值溢出

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

结果:

241

-241

posted @ 2012-10-01 15:13  simcity  阅读(3174)  评论(5编辑  收藏  举报