思考:程序员闲话数字零
date
Apr 22, 2024
slug
talk-about-zero
status
Published
tags
计算机
技术思考
summary
type
Post
众所周知,世纪是对纪年的下一级进制的表达,一个世纪等于一百年,就像小时是分钟的下一级进制的表达,周是天的下一级进制的表达。人们通过创造进制,化大数为小数,使得我们这个“小内存”的大脑得以处理“大数据”。然而,提到世纪这个概念,存在着客观上正确,但让不少人感到别扭的表达,例如:
2000年属于20世纪,一眼看上去,会表示认同。而且对称,美!
1999年属于20世纪,2001年属于21世纪,一眼看上去,会引人思考,甚至有质疑。因为不对称,不完美!
究其所以然,在人类早期文明,0的概念在许多文化中还没有出现。例如罗马数字中,就没有0这个数。所以当公元纪年法建立起来时,人们自然地从1开始标记,而不是0。同理,世纪的计算也遵循了这一模式,从1世纪开始,而不是0世纪。于是现实情况是,公元1年到100年属于第1世纪,公元101年到200年属于第2世纪,以此类推,1991年到2000年属于第20世纪,2001年到2100年属于第21世纪。
如果我们将纪年法从0开始,世纪也从0开始,情况就会变得理想:公元0年到公元99年属于第0世纪,公元100年到199年属于第1世纪,以此类推,1990年到1999年属于第19世纪,2000年到2099年属于第20世纪。美!还能脱口而出!
但是很可惜,这个方案并不可行,因为它涉及到历史传统、文化惯性和实际操作等各个领域的复杂性,需要广泛的国际合作和协议。例如,所有历史教科书、文献和记录都需要相应地调整,这种转换的成本远远超过维持现状的成本,甚至引发混乱。此外,虽然从逻辑和数学的角度,0起始计数看似更加完美,但在现实生活中,0带来的这种“偏差”并没有造成实际操作的问题。
幸运的是,计算机科学为我们提供了重新定义0的机会。在计算机世界中,0不仅被接纳,还被提升到更高的地位。例如数组和其他数据结构的索引通常从0开始。在底层计算机硬件中,数据存储在连续的内存地址中。如果数组的起始内存地址是base,那么第一个元素的位置实际上是base + 0,第二个元素是base + 1,以此类推。这样,元素的索引直接表示了相对于base的偏移量,简化了内存访问:从0开始索引使得从地址到元素的映射变得直接和自然,提高了处理速度。
新问题来了,计算机和现实生活对待0的标准不一致,有了冲突,也就是所谓的信息表达偏差!例如,当用户在使用软件操作表格时,他们期望第一行或第一列的编号为1,而非0。这种习惯与计算机内部的逻辑不一致,常常导致需要在外部(也就是现实生活中)数据和内部(也就是计算机中)数据之间进行加1或减1的转换。更加容易引起混淆的,还有人们赋予0在数字符号之外的另一个特性,那就是,用0可以代表:空、无或者错误。比如说,当我们查看一个账号时,该账号“有0条记录”和“未注册”是两种不同状态的描述,如果把二者在计算机中都用0来表达,就会导致在现实生活中产生歧义。
有了困难不要怕,把困难交给程序员。所谓编程,就是充当计算机语言和人类语言的翻译员。理解了0的基本原理,程序员们能从诸多方面遵循设计策略,提高自身技能,例如:明确默认值,处理边界条件,检查循环和条件语句,检查类型匹配,封装索引转换方法等,从而避免由于0的信息表达偏差带来的问题。
总的来说,0不仅仅是一个数字,更是一个文化和科技发展中的重要符号,它潜移默化中成为连接过去和未来、虚拟与现实的一架桥梁。通过探索0的这些不同方面,我们不仅可以更好地理解它,还可以更深刻地感受到人类文化和科技的相互影响和塑造。