博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
《操作系统真象还原》——0.22 什么是魔数
阅读量:6656 次
发布时间:2019-06-25

本文共 1325 字,大约阅读时间需要 4 分钟。

本节书摘来自异步社区《操作系统真象还原》一书中的第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日),反而还要额外增加一些内容来解释,得不偿失,所以这就是魔数不得不存在的原因。

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

转载地址:http://fjato.baihongyu.com/

你可能感兴趣的文章
windows 2003的三种安装方法
查看>>
rsync的搭建
查看>>
海量数据:判断一棵树是否为另一棵树的子树
查看>>
OpenGL 世界坐标系
查看>>
30家首尔甜品店大推荐!
查看>>
位运算的妙用_判断2的乘方和二进制1的个数
查看>>
sqlplus链接成功,PL/SQL报错:“ORA-12154: TNS:无法解析指定的连接标识符"
查看>>
JS-----------阻止事件的冒泡传播
查看>>
linux目录结构详细介绍
查看>>
Subversion svn无法添加新文件问题
查看>>
SVM入门(六)线性分类器的求解——问题的转化,直观角度
查看>>
#pragma once与 #ifndef的区别
查看>>
牧心:“程序员:造阀门前,先蓄满‘情商池’”
查看>>
SMS管理:收信箱 发信息 编写新信息
查看>>
PC软件加密方案
查看>>
计算机网络 全集视频
查看>>
tomcat自启动脚本
查看>>
内存溢出和内存泄漏的区别
查看>>
linux系统的启动与关闭
查看>>
centos6.2安装GNOME桌面环境
查看>>