文字版傻瓜说明:为什么 iPhone 时间调到 1970 年会变砖 |
您所在的位置:网站首页 › 俄罗斯iphone变砖头是真的假的 › 文字版傻瓜说明:为什么 iPhone 时间调到 1970 年会变砖 |
举个例子:我在写到这篇文章的这一段的时候,查了一下当前的时间: 东八区 2016 年 2 月 17 日 下午 12:04:51 然后我拿这个时间到 UNIX 时间转换器里转换了一下,得到: 1455681891 再用十进制转二进制,得到: 01010110110000111111000101100011, 你能看到这段二进制数是 32 位的——32 个 0 或 1。这是因为,直到 2038 年 1 月 19 日的凌晨 3 时 14 分之前,我们的时间在计算机里都可以用 32 位的 UNIX 时间系统,也就是 32 个 0 或 1 来表示。(为什么?请延伸阅读:2038年问题) 数位太多可能观察起来有点复杂,不如我们找一个 2 位的系统来说明一下。等号前面是二位数,等号后面是十位: 00 = 0 01 = 1 10 = 2 11 = 3 这意味着一个 2 位的系统最高能计的整数是 3,这个数字在计算机学里叫做“二进制寄存器宽度”。 再找一个 4 位的系统: 0000 = 0, 0001 = 1, 0010 = 2, 0011 = 3, 0100 = 4, 0101 = 5…. 以此类推,1111 = 15 一个 4 位 系统最高能计的整数,也即其二进制寄存器宽度是 15。(更方面计算二进制寄存器宽度的公式为 2 的 n 次方 – 1,其中 n 等于系统的位数。) 现在你明白计算机系统的位元系统了!那么整数溢出是怎么回事? 如果你在一个 2 位的系统上尝试计十进制的“4”,会发现系统从“3”的 11 变回了 00;同理,如果你在一个 4 位的系统上尝试计十进制的“16”,会发现系统变回了 0000,这便是“整数溢出”。 再同理,如果你在一个 4 位的系统上尝试计负数,比如 -1 的话,系统会从 0000 跳到 1111,也就是十进制的“15”。这是因为这个整数格式不支持负数,也就是我们讨论的“整数下溢”。 Tom Scott 用电脑游戏《文明》初代里的甘地来解释这个不算 bug 的 bug:游戏初始时,印度执政者甘地的进攻值只有 1(准确反映了现实世界里甘地的“非暴力”哲学思想)。然而在游戏进行中如果不断降低甘地的进攻值,降低到 0 ,进而降低到 0 以下的话,整数系统就乱了,导致甘地的实际进攻值突然被提到最高——这是因为《文明》的系统里采用的整数格式遇到了“整数下溢”…… 这么傻帽的问题为什么解决不了? 事实上,已经解决了…… UNIX 整数格式的确有允许负数存在的版本,然而苹果凑巧目前没有在 64 位 iOS 设备的 UNIX 时间系统里采用这个版本,也就遇到了 1970 年的变砖 Bug…… 随便抓起手边任何一个智能设备(比如你的 64 位 iPhone),尝试把系统时间往最早调(千万别真的调),你会发现绝大多数的最早时间限制都在 1970 年 1 月 1 日。正如前面第一个小章节提到的,这是 UNIX 时间的起点,也是你的 iPhone 能够正确显示的最早时间。 系统时间调到 1970 年 1 月 1 日 0 时 0 分 0 秒,这个操作从计算机原理上本身不会直接导致你的 iPhone 变砖。可一旦你的手机里存储了之前的短信、电子邮件,或者已经过期的日历项,这会导致系统在追溯时间时最终定位到了一个比 1970 年 1 月 1 日 0 时 0 分 0 秒更早的时间。 这样,你的 iPhone 的 UNIX 时间变成了一个负整数——也就是在二进制数 64 个 0 的基础上,发生了一次整数下溢…… 接下来,iPhone 会发现你老婆一秒钟前给你发来的短信,发生在二进制 64 个 1 所代表的 UNIX 时间中。换算成人类的时间,也就是 292277026596 年 12 月 4 日 15 时 30 分 6 秒。 可能由于苹果公司 iPhone 在设计的时候根本没想过这台设备能在大约 8000 年以后开机,也就显示不了超过五位数的年份,更别提一个十二位数的年份了。 因此,你的 iPhone,就这样变砖了。换句话说,你的 iPhone,跪倒在永生的宇宙万物面前了。返回搜狐,查看更多 |
今日新闻 |
推荐新闻 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |