C语言有符号加减溢出

http://blog.youkuaiyun.com/youxin2012/article/details/36425791

C语言有符号加减溢出

分类: 深入理解操作系统   142人阅读  评论(1)  收藏  举报

sizeof(short int ) = 2;

测试用例

[cpp]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. #include <stdio.h>  
  2.    
  3. int main()  
  4. {  
  5.     short int a = -32768;  
  6.     short int b = 0x8000;  
  7.     short int c = 0xffff;  
  8.     short int d = 0x8001;  
  9.     printf("%d, %d, %d, %d\n", a, b, c, d);  
  10.     a -= 1;  
  11.     b -= 1;  
  12.     c -= 1;  
  13.     d -= 1;  
  14.     printf("%d, %d, %d, %d\n", a, b, c, d);  
  15.    
  16.     return 0;  
  17. }  
结果:


b, c, d的表示均为16进制表示,即机器的存储形式, 补码表示

负数溢出计算 
理解一:(按机器存储来看,存储均为补码形式)
a 的补码形式(存储形式)为 1000 0000 ... 0000       a-1机器存储为 01111...1  为 32767的补码
理解二:(如下图)
a为最大负数, a -1 = a+ 2^32 - 1  = -32768 + 65536 -1 = 32767

                图 一

b:  0xffff 为 -1的补码形式

补充:
short int 最大正数为 32767  
测试 37267 + 1 = 01111...1 +1 = 100...0  (为 -32768的补码)
所以
short int a = 32767;
a += 1;
printf("%d\n", a); // -32768 从 图 一 同样可以看出
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值