编程中,对于你定义的任何一个“量”,你都必须要清楚它的范围。比如月份是1~12,考虑闰月就是1~13,用了0就是0~12。如距离,1mm~60000mm,超过这个数我不处理。这样你才能决定用什么样的存储形式来保存这个量。比如1mm~60000mm的距离,保存在32位无符号整数里是合适的,64位当然也没有问题。但是同样的距离用微米表示的话就超出了32位无符号整数的范围了,就需要用更大的存储形式。
举一个例子
unsigned char counter;
for (counter = 0; counter < 1000; counter++) {
// 略}
counter在这里被当作整数使用,它是一个8位的。它能保存的值范围是0~255。这个for循环永远不会满足结束条件。
另一个例子,2038年问题。
你可能听说过“千年虫”,这个和它类似。世界上数以亿计的计算机都以POSIX为基础。POSIX的时间是以1970年1月1日0时0分0秒(POSIX纪元或UNIX纪元)开始的秒数表示的。
在32位系统中使用的是32位有符号整数。32位有符号整数的取值范围是-2147483648 ~ 2147483647。也就是说这个时间的最大值是1970年1月1日开始的2147483647秒后,即2038年1月19日3时14分07秒。此时间后再过一秒,这个存储着时间的32位有符号整数将发生上益出。有符号整数上溢出在C语言标准中是没有规定的。一种结果是,在这个数的原始形式上(无符号)再加一,导致它发生“绕回”,其作为有符号整数的值变成-2147483648,即1901年12月13日20时45分52秒。
如果系统不考虑1970年以前的时间,从而使用了32位无符号整数,那么“绕回”发生的时间将会推迟至1970年1月1日开始的4294967295秒,即2106年2月7日6时28分15秒后,再过一秒。
在64位系统中,“绕回”前是292277026596年12月4日15时30分08秒。