关于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

转载于:https://www.cnblogs.com/servo/archive/2012/10/01/2709744.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值