网上有许多电话号码,你知道最常见的是哪个?
有个老外找到了答案,这个号码就是2147483647。
事情是这样的,我们知道,在计算机中,整数往往用4个字节保存。4个字节就是32位,由于最高位是符号位,那么只剩下31位,也就是说,这种方式所能保存的最大整数是2的31次方-1(因为要去掉零),即2147483647。
这个老外突然意识到,这是一个10位数,与美国电话号码的位数相同。于是,他就很好奇,214-748-3647会是谁的号码呢?
214是美国达拉斯市的区号,但是搜索后发现,超过1500个网站上有这个号码,遍布全美各地。
为什么会这样?
很显然,大量程序员考虑不周,使用4个字节的整数保存电话号码。当用户输入的号码大于2147483647时,就会自动转成这个数字。因此,它就成了网上最常见的电话号码。
===================================
我一时兴起,想看看国内有没有人犯这个错误。事实证明,真的是有一大把。
因为我国的长途区号没有0214,所以这个号码只能是在上海(区号021)。一想到他会接到各种各样的来电,要求提供租车服务、租房服务、美容服务、餐饮服务、耐磨材料等等,我就对021-47483647的主人充满同情。
(完)
jalan 说:
haha, this is funny.
2011年2月10日 03:59 | # | 引用
CAT MOSS 说:
不是程序员不明白吧。
2011年2月10日 07:42 | # | 引用
野草博客 说:
那个号码真的存在吗?
汗一个~
2011年2月10日 08:59 | # | 引用
xiaket 说:
这篇很漂亮~~ :)
2011年2月10日 09:11 | # | 引用
Tydus 说:
确实,第一眼就发现是这数= =(程序猿无鸭梨滚过
2011年2月10日 09:14 | # | 引用
必填 说:
第一张配图是有人修改游戏的结果吧?
2011年2月10日 09:32 | # | 引用
bush 说:
可憐的程序員,這個和千年蟲如出一轍
2011年2月10日 09:38 | # | 引用
日月山人 说:
不用同情,这个电话是打不通的,上海没有这个电话段的号码
2011年2月10日 12:55 | # | 引用
61 说:
上海电话没有以4开头的一般是以5和6开头,所以对不起,您所拨打的电话是空号。
2011年2月10日 13:19 | # | 引用
gsid 说:
宋丹丹说,“囧死我了”。。
2011年2月10日 14:49 | # | 引用
macafee 说:
上海有4开头的号码的。
2011年2月10日 16:18 | # | 引用
Gabri 说:
这个问题(文章)很有趣
2011年2月10日 17:07 | # | 引用
moqi 说:
搜索结果不到20条,也能叫“一大把”?
2011年2月10日 19:01 | # | 引用
ssddi456 说:
2147483647 使用google得到140,000,000条结果
21 47483647 使用google得到11,200条结果
021 47483647 使用google得到61条结果
214-748-3647 使用google得到25,200 条结果
当然这些结果是从http://www.google.com.hk上得到的。
使用百度的话结果当然会少很多。
2011年2月10日 19:36 | # | 引用
sos 说:
那我有一个疑问。就像TXT里面数字都是一个个独立的字符来存储的
为什么不以整数来存储?
然后是游戏存档里的数值也是按整数来存储还是按TXT的方式呢?
2011年2月11日 01:56 | # | 引用
游客 说:
似乎是胡说八道呢!
如果是用带符号整数保存,那么当用户输入的号码大于2147483647时,就会是负数!
如果是用无符号整数保存,那么最大值是42,9496,7295(2……32-1)。
2011年2月11日 09:34 | # | 引用
腾原 说:
道理是讲清楚了,
但是我还是不够明白。可能是外行的缘故。
最重要的是,
如果我有类似的需要时,
怎么操作,才能得到有效的结果呢?
换句话说,
我如何避免这个错误及其带来的麻烦?
2011年2月12日 09:43 | # | 引用
腾原 说:
一峰兄:
我如果有这种操作的需要,
该怎么避免类似错误和
可能的麻烦呢?
2011年2月12日 10:31 | # | 引用
GlaDOS 说:
能否在Blog页面加上一个返回主页的链接?有时从Google搜索点进Blog后又想看看Tweets和What I read,如果能加一个链接的话可以方便很多。
2011年2月12日 15:05 | # | 引用
wadefelix 说:
看来这个电话号码是java程序员的杰作
2011年2月12日 19:05 | # | 引用
randyn 说:
拨打了下,这个号码应该不存在...
我想中国的程序员不会用一个整形来处理一个电话号码,不然区号大点的区号就无法处理了
2011年2月14日 11:50 | # | 引用
hemon 说:
我用bigint,存手机号码就会发现int不够用
2011年2月15日 11:05 | # | 引用
Snow 说:
Java中不存在有无符号一说,所以都看作是有符号的
2011年2月15日 15:41 | # | 引用
Timesand 说:
这篇文章不仅有趣,更反映了阮兄睿智的大脑和深刻的洞察力。该去炒股票啊!
2011年2月15日 22:41 | # | 引用
刘金雨 说:
“当用户输入的号码大于2147483647时,就会自动转成这个数字。” 感觉这句话里面的“自动转成”其实蛮有意思的,什么系统会在整数溢出的时候将非符号位“自动转成”全1的值呢?百思不得其解,可惜此处一笔带过了
2011年2月16日 14:21 | # | 引用
badants 说:
你拨打的电话是空号!呵呵,这号码没人敢用啊。
2011年2月16日 19:27 | # | 引用
十圆机选郎... 说:
我拿这号去买七星彩,中了500万大奖的话分软哥10万...
2011年4月11日 04:25 | # | 引用
boatman 说:
2,147,483,647(二十一亿四千七百四十八万三千六百四十七)是2147483646与2147483648之间的自然数,也是欧拉在1772年所发现的一个梅森素数,它等于231-1,是32位元操作系统中最大的符号型整型常量,例如在Pascal语言中长整型的范围是-2147483648~2147483647。
它是4个已知的双重梅森素数的其中一个。
2011年12月15日 21:25 | # | 引用
csj 说:
最后一句话,够闷骚。
2011年12月27日 14:47 | # | 引用
mengzhuo 说:
这个值就拿来做边界值了
2012年10月25日 11:15 | # | 引用
skystar 说:
有吗?上海住了那么多年,从来没见过4开头的号码
2013年3月13日 13:56 | # | 引用
idear 说:
刚拔了,空号!
2013年8月17日 22:01 | # | 引用
Huaxing Zheng 说:
我以为是110
2017年1月31日 10:13 | # | 引用
imhuster 说:
this condition happened in some database,MySQL for example.
2017年3月28日 17:09 | # | 引用