本文共 1325 字,大约阅读时间需要 4 分钟。
本节书摘来自异步社区《操作系统真象还原》一书中的第0章,第0.22节,作者:郑钢著,更多章节内容可以访问云栖社区“异步社区”公众号查看
魔数,magic number,这让一部分人感觉到迷惑,也让另一部分人迷惑。哈哈,两个迷惑,把我们都搞迷惑了,作者你到底想表达什么意思啊。没错,其实魔数的本意就是让人感到迷惑的数,看到某个数,不知道其代表何意,用东北话说,都蒙圈了。一部分人对这个概念迷惑的原因是这有什么好解释的,一种司空见惯的东西,即使不知道是怎么来的,但由于大脑经常被其训练,对其已经形成深刻的印象,似乎理所当然地接受了。当我向别人请教一个类似的问题时,如果被回复“这是规定”时,我就很无语。任何规定都是出自于某种原因才做出的,很少有规定是靠拍脑门或抓阄决定的。就像国外的电视剧,一部称为一季,季是由season翻译过来的,表示季节,一个时段。一个季节过去了,这和电视剧整体情节暂告一段落是一样的,这较容易理解。
另一部分人感到迷惑的原因是真心想搞清楚概念是什么意思,我也属于这一类。
魔数,其实也称为神奇数字,我们大多数人是在学习计算机过程中接触到这个词的。它被用来为重要的数据定义标签,用独特的数字唯一地标识该数据,这种独特的数字是只有少数人才能掌握其奥秘的“神秘力量。”
对魔数简单的阐述就是:不明就理地出现一个数字,不知道其是什么意思,感觉看不透,猜不出,就像魔法一样很神秘。了解一定上下文的人肯定知道是什么意思,一般局外人绞尽脑汁也不解其意。就像小姑娘对着小伙子伸出大拇指和食指,小伙子马上就意会了,这是让我晚上8点在村口东边老槐树下见。
如果程序中出现这样的代码:
int a = 2014 – 1987;
#define birthday 1987;int a = 2014 – birthday;
由于1987用了一个宏代替,即使变量名称不改为age,还叫作a,大家也明确了这是在求年纪呢。
故,直接出现的一个数字,只要其意义不明确,感觉很诡异,就称之为魔数。魔数应用的地方太多了,如elf文件头。
ELF Header: Magic: 7f 45 4c 46 01 01 01 00 00 00 00 00 00 00 00 00
这个Magic后面的一长串就是魔数,elf解析器(通常是程序加载器)用它来校验文件的类型是否是elf。
主引导记录最后的两个字节的内容是0x55,0xaa,这表明这个扇区里面有可加载的程序,BIOS就用它来校验该扇区是否可引导。
有人说只要为这些数字赋予实际的意义不就行了吗。其实,无论怎么给这组陌生的数字赋予名称,它都不像熟悉的出生日期那样直观易懂(如对于19590318,不解释大家也会知道0318是3月18日),反而还要额外增加一些内容来解释,得不偿失,所以这就是魔数不得不存在的原因。
可见,计算机中处处是协议、约定。不过为了程序意义清晰可维护性强,尽量还是少用魔数。
转载地址:http://fjato.baihongyu.com/