首先,它是2的幂,除非你是某种数学天才的这无疑不是最明显的事情。而且,准确的说,这是2 ^ 31。这是显著 - 因为你会在一分钟内看到。
在二进制中,2147483647是011111111111111111111111111111111111111111111111111111111111111111111111111111111111111111,并且它是在使用“2的补码”符号时能容纳32位的最大正数——“2的补码”符号表示允许负值的数字。如果我们可以使用最左边的(高阶)位,最大的可能数字将是两倍大,因为每增加一个比特,二进制数可以表示的数字范围将翻倍。
2147483648正好是256 * 256 * 256 * 256然后除以2得到的结果。没有兴趣了吗?给我一点时间。
保留在4字节或32位数字中的第32位用于表示该数字是正的还是负的。如果是0,如01111111111111111111111111111111,号码是+ 2147483647如果是1,在11111111111111111111111111111111,号码是-2147483648。
因此,Unix系统有一种表达各种数值的方法,也有一种表示负数的方法。这并不意味着你不能处理大得多的数字。在今天的Linux系统上,2147483648甚至还不能接近您可以操作的最大数字。让我们来看看我在AWS系统上的命令行操作中的一小段摘录:
$回声$ N 25227339711002779721296336059113506713437716431793799076536161744218926098 42688929348009219253857839258425602022609412708599928289785519021711589989 59576178192 $ N =`EXPR $ N \ * 9999` $回声$ N 25224816977031679443324206425507595362766372660150619696628508128044504205 81704660455074418331932453474499759462407151767329068296956540469809418830 596802205741808
显然,您可以在命令行上使用的数字可以具有更大范围的值。即便如此,2147483647还是有一定的名气的。这个数字表示Unix系统上可以表示的最近的(即,未来最遥远的)日期——至少目前是这样。在2038年之前的某个时候,各种“风格”Unix的开发人员将不得不考虑下一步该做什么。为什么这很重要,为什么是2038年?
要理解这一点为什么如此重要,您必须考虑Unix如何存储日期。要查看二进制表示的当前日期和时间,可以使用date命令:
日期+%S 1449012345
您可能听说过Unix“纪元”。为了或多或少地暗示Unix的诞生,epoch指的是1970年1月1日。如果您在当天开始时创建了一个文件,那么与它相关的日期将以0的形式存储在系统中。如果我们使用date命令的-d选项,我们可以让它将日期“0”翻译成一个日期/时间字符串,如下所示:
$日期-d @ 0周四1月1日00:00:00 UTC 1970年
如果我们,相反,使用日期的最大值,我们会得到这样的:
$日期-d @ 2147483647
1月19日星期二03:14:07(国际标准时间2038)
相反地,最小日期从历元(1970年1月1日)所述同样的秒数跳回作为最大日期向前跳:
$ date -日期@-2147483648 Fri Dec 13 20:45:52 (UTC 1901
这意味着最大的日期,可以存储在一个Unix系统是1月19日,2038年,就像千年虫,担心人们16年前,2038年的问题可能会破坏系统和设备当日期从01111111111111111111111111111111到10000000000000000000000000000000,可能解释为12月13日,1901年。到那时,幂函数可能会再增加一个或两个字节到日期/时间表示,或者停止使用两个的补码格式,给我们大约68年的时间来考虑这个问题。希望我们不会有太多的系统驱动行星或绕着它旋转,不能调整到新的日期。
千年虫问题是真的,只是因为多种应用存储年2个位数的领域是这样,一旦2000年开始,就看他们像1900年然而,尽管所有的狂飙突进运动的问题,我们搬进21世纪少了很多的问题,我们中许多人期待。
2038问题将花费更多的时间和精力,因为它涉及到以逐秒精度表示日期的内部表示。这些日期和时间对很多过程和设备都很重要。但只有1449012345。我们还有时间。