C语言有符号加减溢出

来源:互联网 发布:centos7打开8080端口 编辑:程序博客网 时间:2024/05/22 08:13

http://blog.csdn.net/youxin2012/article/details/36425791

C语言有符号加减溢出

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

sizeof(short int ) = 2;

测试用例

[cpp] view plaincopy在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 从 图 一 同样可以看出
0 0
原创粉丝点击