c语言 计算器_C语言学习日记(8)——整数溢出

小时候喜欢玩电子计算器,觉得很神奇,想要算什么数,立刻就能算出来。当时看着计算器的液晶屏幕就想,如果算一个很大的数,超过了屏幕上面数字的位数,会怎么样呢?试了以后结果是INF,那就是无穷大了。虽然当时还小,但好像也知道那是电子计算器位数不足,从此觉得计算机虽然神奇,但计算能力也是有限的。

同样,计算机虽然计算能力强大,但计算能力也受位数的限制,并不是无穷的。以int类型为例,当我们定义一个int类型变量时,它的位数为32位,4个字节。

int n;//定义了一个整型变量,占4个字节

在C语言中,整型变量分为带符号和不带符号两种。int其实是signed int的简写,也就是带符号的。它保存的整数是有上下限的,最大为2147483647(21亿多),最小为-2147483648。

如果计算结果超出了int类型变量的上下限,会怎么样呢?我们来定义一个整型变量,并且将它初始化为最大值,然后再加1,看看会发生什么现象?

int n = 2147483647;//定义一个整型变量,并初始化为最大值n++;   //n现在是多少呢?

答案是-2147483648。很奇怪啊,一个正数加1竟然变成了负数。再仔细看看,这个负数就是int类型的最小值,也就是说在int类型的最大值上加1,就变到了最小值。所以老祖宗说物极必反嘛。

怎么理解呢?由于int类型的最大值为2147483647,最小值为-2147483648,那么对于它来说,这两个数就相当于正无穷大和负无穷大,我们可以想象一条数轴,本来是一条直线,我们将这条直线两头接到一起,形成一个圆。那么正无穷大加1就来到了负无穷大,负无穷大减1就来到了正无穷大。这种现象就叫做整数溢出。

如果发生整数溢出,计算结果就不可靠。我们在计算的时候要选取合适的数据类型,确保能够装得下计算结果,不发生溢出。如果计算结果是正数,但是超过了int的上限,我们可以考虑上限更大的unsigned int来保存,由于不用表示负数,unsigned int表示正数的上限是int的两倍。

如果定义一个unsigned int型变量,并初始化为它的最大值,然后加1,会变成多少呢?显然会变成0。我们写一小段代码试一下:

#include #include #include //包含这个头文件,不写好像也没问题int main(){    unsigned int n = UINT_MAX;  //宏定义,表示 unsigned int的最大值    n++;    printf("%u",n);    //输出unsigned int类型要用%u转换说明符    system("pause");    return 0;}
2e1788ef88c1604a93b408af2db0d248.png

运行结果

代码里的UINT_MAX是一个宏定义,定义在limits.h这个文件内。前面小猫所写的上下限都是在这个文件内看到的。下面这几行是从limits.h中截取的。

#define INT_MIN (-2147483647 - 1)   #define INT_MAX 2147483647#define UINT_MAX 0xffffffffU

以后我们就用INT_MAX,INT_MIN来表示int型变量的上下限,这样方便多了。

整数溢出会带来一个麻烦,那就是C语言中的时间。前面小猫已经知道在64位系统中,time_t类型实际上是long long类型,long long类型上限为9223372036854775807,这是个非常大的数字,不用太担心。但在32位系统中,time_t类型实际上是long类型,只占4个字节,上限和int一样,也就是21亿多,如果达到了最大值,时间就归零啦。小猫算了一下,大概是2038年吧,不过现在64位已经普及了,就不用担心了。

就到这里啦。开心。

36b219d098eb2b344eddf822a0d6d3f5.png

C语言学习日记

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值