对整型变量存储溢出的一些思考

今天看到阮一峰先生的一篇文章,介绍了一个因为错误使用整型变量而产生的bug。

文中有一小段我未能理解:

很显然,大量程序员考虑不周,使用4个字节的整数保存电话号码。当用户输入的号码大于2147483647时,就会自动转成这个数字。

我发现评论里有许多人和我有类似的疑问:为什么输入一个很大的数字之后,会自动转换成2147483647,而不是报错或者变成其他奇怪的值。

经过和网友的讨论,我做了一些实验,来测试当试图存入一个会溢出的数字时,会发生什么?

 

测试用代码:

int a = (int) 0xAABBCCDDEEFF1122LL;//若不使用强制类型转换,编译器会报错
printf("%d %X",a,a);

运行后的结果:

-285273822 EEFF1122

我发现,这个超长的整数在赋值之前被截断了,而并非像文章中所描述的那样取了整型范围内的最大值。

这时有人指出,在操作MySQL数据库时,如果插入的整数值超过其最大范围,会取范围内允许的最大值。同时附上了截图

至此,我的困惑才得以解答。原来是在数据库存储时,使用了错误的数据类型,才导致了这个bug出现。

 

在查阅资料的过程中,我在维基百科上发现了一则类似的事件

2014年12月,谷歌宣称因Youtube上播放次数最多的视频,PSY的《江南Style》音乐视频的播放次数超过了播放计数器的最大值(32位正负整型,即2147483647),导致Youtube不得不将播放计数器升级至64位整型。 后来谷歌承认这是一个玩笑。

转载于:https://www.cnblogs.com/nangcr/p/thinking-of-integer-overflow.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值