大家好,我是鱼皮,无意间在网上看到了这么一张图:

刚看到这段代码时,我是比较吃惊的,作者竟然使用了一个英文单词 deadbeef 来定义宏常量!

我本来以为只是一位幽默的程序员的小玩笑,但后来查阅资料才知道,上图的这段代码竟是 C++ 的 hash_map 源码!而作者使用这个特殊的英文单词也是 “别有用心”。

deadbeef  的英文直译是死牛肉,但在编程领域中,它却有更深层的含义。给这个单词加上 0x 、再转换为大写,就得到了一个典型的十六进制数字:0xDEADBEEF。这个数字经常用来标识新分配但是还未初始化的内存;在嵌入式系统中,也常常用它来表示程序崩溃或者出现了死锁,比如运行在 32 位 PowerPC 处理器上的 IBM RS/6000 系统、Mac OS 系统。

那我不禁感到好奇,为什么选择了这样一个单词,而不是 “FishPi” 之类的(开个玩笑,16 进制最多到 F)。

到网上查了一会,得到的结论竟然是:没什么理由,它是一个 “魔数”

所谓魔数,就是毫无理由、凭空出现、也不需要去解释其含义的常量。就是这么任性!

除了 deadbeef 外,我还百度到了很多魔数,比如:

  • 0xBAADF00D ("bad food" 烂饭) 被微软的 LocalAlloc(LMEM_FIXED)使用,在使用调试堆时指示未初始化的已分配堆内存

  • 0xDEADC0DE ("dead code" 死码) 在 OpenWRT 固件中用作标记,在静态固件的末尾表示要创建的 jffs2 文件系统的开始

  • 0xDEAD10CC ("dead lock" 死锁)  用于表示 iOS 系统的闪退报告

是不是感觉很神奇?也许这就是程序员的浪漫吧。

看到这里,我忍不住了,也去写了几个魔数,大家来猜猜看是什么意思:

redisLock.lease(86400);
if (fileSize > 1073741824) {...doSomething
}
if (num > 2147483647) {printf("you lose");
}

这几个值都是我们写代码时经常用的,84600 = 3600 * 24 表示一天;1073741824 = 1024 * 1024 * 1024 表示 1 GB;而 2147483647 是 Java 等编程语言中 int 类型的最大值。

我把这些代码拿给我朋友一看,他嘲笑道:人家大佬写的魔数叫魔数,而你写的,只能叫烂代码。

的确,除非是上面那些大佬 / 前辈公认的、约定俗成的魔数外,我们在平时写代码的时候,尽量不要使用魔数,它会严重影响代码的可读性。我们可以通过定义常量来给这些魔数加上 “注释”,比如:

int ONE_DAY = 86400;
int ONE_GB = 1073741824;
int MAX_INTEGER = 2147483647;

这样就清晰很多了,也减少了我们输入错误的风险。

除了上面提到的魔数外,我还在网上看到了一些有实际意义的魔数,比如现代 3D 游戏之父约翰·卡马克在雷神之锤中的魔数:

i = 0x5f3759df - ( i >> 1 );

完全不敢相信,上面这行代码竟然可以快速计算一个数字的平方根的倒数!

在网上一查,还有很多论文专门研究这个东西:

不得不感叹编程的魅力、数学的魅力啊!什么时候,我也能创造一个人尽皆知的魔数呢?

这代码谁写的,太可怕了!相关推荐

  1. java面试题25 在程序代码中写的注释太多,会使编译后的程序尺寸变大。

    java面试题25 在程序代码中写的注释太多,会使编译后的程序尺寸变大. A:正确 B:错误 蒙蔽树上蒙蔽果,蒙蔽树下你和我 拿到这道题,我觉得说的贼有道理,注释太多,尺寸变大.无疑与就和驾考 一样, ...

  2. Python代码如何写的更优雅

    首先最重要的一点, 忘掉其他语言里的写法, 尝试使用Python风格进行code, 熟练之后,你会觉得她真的很美! 1. 多个值进行初始化 # > yes s1,s2,s3 = [],[],0 ...

  3. 关于代码手写UI,xib和StoryBoard

    代码手写UI 这种方法经常被学院派的极客或者依赖多人合作的大型项目大规模使用.Geek们喜欢用代码构建UI,是因为代码是键盘敲出来的,这样可以做到不开IB,手不离开键盘就完成工作,可以专注于编码环境, ...

  4. 【Xamarin挖墙脚系列:代码手写UI,xib和StoryBoard间的博弈,以及Interface Builder的一些小技巧(转)】...

    正愁如何选择构建项目中的视图呢,现在官方推荐画板 Storybord...但是好像 xib貌似更胜一筹.以前的老棒子总喜欢装吊,用代码写....用代码堆一个HTML页面不知道你们尝试过没有.等页面做出 ...

  5. google python代码规范_Python代码这样写才规范优雅! (二)

    前文传送门:Python代码这样写才规范优雅! (一)参考:https://www.python.org/dev/peps/pep-0008/Python PEP8编码规范的内容如下: 1. Intr ...

  6. 代码手写UI,xib和StoryBoard间的博弈,以及Interface Builder的一些小技巧

     http://www.cocoachina.com/industry/20140102/7640.html 最近接触了几个刚入门的iOS学习者,他们之中存在一个普遍和困惑和疑问,就是应该如何制作 ...

  7. 基础才是王道——TCP/IP详解学习笔记 这位仁兄写得太好了

    TCP/IP详解学习笔记 这位仁兄写得太好了 TCP/IP详解学习笔记   这位仁兄写得太好了. http://blog.csdn.net/goodboy1881/category/204448.as ...

  8. 抖音java表白教程_抖音上的表白代码是什么 抖音表白代码怎么写

    抖音上的表白代码是什么 以前大家总说工科生不懂浪漫,但最近抖音上很流行用代码来表白,将代码编写好,然后将文档发给要表白的对象,然后就可以等着对方进入你的表白套路了.其实这是弹窗表白的代码不是很复杂,一 ...

  9. 程序员写代码要写注释吗?写你就输了

    前言:在职业发展道路上,需要不断提升自己,需要学习资源的,一起学习交流的欢迎加群[443128517],小编准备了学习视频,学习线路,自学书籍,职业发展视频.也可以加美女老师七七的微信.二维码放在下面 ...

  10. html5中的空格怎么写,空格的代码(【html5空格代码怎么写】)

    空格的代码([html5空格代码怎么写]),哪吒游戏网给大家带来详细的空格的代码([html5空格代码怎么写])介绍,大家可以阅读一下,希望这篇空格的代码([html5空格代码怎么写])可以给你带来参 ...

最新文章

  1. 香港大学自然语言处理实验室PhD/RA招生(HKU NLP)
  2. vue 生命周期_Vue 生命周期
  3. Gradle 教程:第一部分,安装【翻译】
  4. B12_Numpy字符串函数(add,multiply,center,capitalize,title,lower,upper,split,join,replace,decode,splitline)
  5. Vmware快速安装linux虚拟机(SUSE)
  6. 用户登录色一句java_用户权限及角色
  7. android数据持久化框架,Android:数据持久化、Environment、SharedPreferences、内部存储internalStorage...
  8. 龙世界java下载_龙世界3-龙王之剑
  9. Python基础(Day 2)(数值 字符串 布尔 列表)
  10. 【Kubernetes学习笔记】-kubeadm 手动搭建kubernetes 集群
  11. Maven之快速入门
  12. 软件测试笔记_09_自动化相关概念【重要】
  13. Java实现LeetCode第199场周赛(题号5472,5473,5474,5462)
  14. 用Python + Wxpy 为女友搭建简单微信机器人
  15. 滴水内核中级班阶段测试题
  16. 已解决idea连接数据库异常:Exception in thread “main“ com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException:
  17. 【附源码】计算机毕业设计java智能仓储设备管理系统设计与实现
  18. 2022-2028全球纸胶带行业调研及趋势分析报告
  19. 简单介绍如何应用【Poi-tl】将【个人简历】导出为【docx】格式的【word】文档
  20. 我有一个计算机梦想作文500,我的梦想作文500字

热门文章

  1. 知网、万方数据库免费下载论文------比连接学校内网速度快数倍不止(有的学校万方数据库不支持下载)
  2. 深入浅出工控机防病毒安全现状
  3. asp.net 自定义控件之ItemTemplate
  4. 可以分屏的软件_matepadpro笔记软件体验
  5. HDU_4506 小明系列故事——师兄帮帮忙
  6. 博弈论(1):囚徒困境中的博弈论
  7. 计算机amibios设置教程,主编教您ami bios刷新步骤
  8. espcms_v5的/public/class_connector.php 对Cookies中输入参数ecisp_member_info过滤不当
  9. cesium 切换瓦片地图的加载方式
  10. iOS疯狂详解之开源库