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

今天看到阮一峰先生的一篇文章,介绍了一个因为错误使用整型变量而产生的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位整型。 后来谷歌承认这是一个玩笑。

猜你喜欢

转载自www.cnblogs.com/nangcr/p/thinking-of-integer-overflow.html