码迷,mamicode.com
首页 > 编程语言 > 详细

C语言有符号加减溢出

时间:2014-07-03 17:15:54      阅读:275      评论:0      收藏:0      [点我收藏+]

标签:溢出   有符号数   

sizeof(short int ) = 2;

测试用例

#include <stdio.h>
 
int main()
{
    short int a = -32768;
    short int b = 0x8000;
    short int c = 0xffff;
    short int d = 0x8001;
    printf("%d, %d, %d, %d\n", a, b, c, d);
    a -= 1;
    b -= 1;
    c -= 1;
    d -= 1;
    printf("%d, %d, %d, %d\n", a, b, c, d);
 
    return 0;
}
结果:

bubuko.com,布布扣

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

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

              图 一

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 从 图 一 同样可以看出

C语言有符号加减溢出,布布扣,bubuko.com

C语言有符号加减溢出

标签:溢出   有符号数   

原文地址:http://blog.csdn.net/youxin2012/article/details/36425791

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!