《操作系统真象还原》——0.22 什么是魔数

本节书摘来自异步社区《操作系统真象还原》一书中的第0章,第0.22节,作者:郑钢著,更多章节内容可以访问云栖社区“异步社区”公众号查看

0.22 什么是魔数

魔数,magic number,这让一部分人感觉到迷惑,也让另一部分人迷惑。哈哈,两个迷惑,把我们都搞迷惑了,作者你到底想表达什么意思啊。没错,其实魔数的本意就是让人感到迷惑的数,看到某个数,不知道其代表何意,用东北话说,都蒙圈了。一部分人对这个概念迷惑的原因是这有什么好解释的,一种司空见惯的东西,即使不知道是怎么来的,但由于大脑经常被其训练,对其已经形成深刻的印象,似乎理所当然地接受了。当我向别人请教一个类似的问题时,如果被回复“这是规定”时,我就很无语。任何规定都是出自于某种原因才做出的,很少有规定是靠拍脑门或抓阄决定的。就像国外的电视剧,一部称为一季,季是由season翻译过来的,表示季节,一个时段。一个季节过去了,这和电视剧整体情节暂告一段落是一样的,这较容易理解。

另一部分人感到迷惑的原因是真心想搞清楚概念是什么意思,我也属于这一类。

魔数,其实也称为神奇数字,我们大多数人是在学习计算机过程中接触到这个词的。它被用来为重要的数据定义标签,用独特的数字唯一地标识该数据,这种独特的数字是只有少数人才能掌握其奥秘的“神秘力量。”

对魔数简单的阐述就是:不明就理地出现一个数字,不知道其是什么意思,感觉看不透,猜不出,就像魔法一样很神秘。了解一定上下文的人肯定知道是什么意思,一般局外人绞尽脑汁也不解其意。就像小姑娘对着小伙子伸出大拇指和食指,小伙子马上就意会了,这是让我晚上8点在村口东边老槐树下见。

如果程序中出现这样的代码:

int a = 2014 – 1987;
根据直觉,似乎这是在求年龄,因为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日),反而还要额外增加一些内容来解释,得不偿失,所以这就是魔数不得不存在的原因。

可见,计算机中处处是协议、约定。不过为了程序意义清晰可维护性强,尽量还是少用魔数。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值