八进制/十六进制符号来自哪里?

Joh*_*ohn 14 c hex octal

经过这么长时间,我从没想过要问这个问题; 我理解这来自c ++,但背后的原因是什么:

  • 像往常一样指定十进制数
  • 通过前导0指定八进制数
  • 通过前导0x指定十六进制数字

为何0?为什么是0x?基础-32有自然进展吗?

小智 16

C,C++和Java的祖先,最初由Dennis Richie在70年代早期开发的PDP-8s.这些机器具有12位地址空间,因此指针(地址)长度为12位,最方便地用代码表示三个4位八进制数字(第一个可寻址字为000octal,最后一个可寻址字为777octal).

八进制不能很好地映射到8位字节,因为每个八进制数字代表三位,因此总是会有八位符号表示的多余位.全TRUE位字节(1111 1111)是八进制的377,但是十六进制的FF.

对于大多数人来说,十六进制更容易在二进制中转换为二进制数,因为二进制数通常用八个块表示(因为这是一个字节的大小)而八个正好是两个十六进制数字,但十六进制符号本来就很笨重并且在丹尼斯的时间中误导(暗示能够解决16位).程序员在使用硬件时(每个位通常代表物理线)和使用逐位逻辑(每个位具有程序员定义的含义)时需要考虑二进制.

我想丹尼斯在每日十进制数字上添加了0前缀作为最简单的可能变体,对于那些早期解析器来说最容易区分.

我相信Hex符号0x__稍后会添加到C中.编译器解析树以区分1-9(十进制常量的第一个数字),0(八进制常量的第一个[无效]数字)和0x(表示后续数字中的十六进制常量)相互之间的相当多比仅仅使用前导0作为指示符从解析后续数字切换为八进制而不是十进制更复杂.

丹尼斯为什么这样设计? 当代程序员并不认识到那些早期的计算机通常是通过在CPU前面板或打孔卡或纸带上物理翻转开关来向CPU切换指令来控制的.保存一些步骤或指令的所有环境都代表了大量手工劳动的节省.此外,内存有限且昂贵,因此即使保存一些指令也具有很高的价值.

总结:0表示八进制,因为它是高效可解析的,而八进制在PDP-8上是用户友好的(至少对于地址操作)

0x的十六进制可能是因为它是八进制前缀标准上的自然且向后兼容的扩展,并且仍然相对有效地进行解析.


Jim*_*son 7

八进制的零前缀和十六进制的0x来自Unix的早期.

八进制存在的原因可以追溯到有6位字节的硬件,这使得八进制成为自然选择.每个八进制数字代表3位,因此6位字节是两个八进制数字.十六进制也是如此,从8位字节开始,其中十六进制数字是4位,因此一个字节是两个十六进制数字.对八位字节使用八进制需要3个八进制数字,其中第一个只能有值0,1,2和3(第一个数字实际上是'tetral',而不是八进制).除非有人开发出一个字节长度为十位的系统,否则没有理由去base32,因此十位字节可以表示为两个5位"nybbles".


Eri*_*hil 5

"新"数字必须以数字开头,以使用现有语法.

已建立的实践具有变量名称和以字母开头的其他标识符(或一些其他符号,可能是下划线或美元符号).所以"a","abc"和"a04"都是名字.数字以数字开头.所以"3"和"3e5"是数字.

当您向编程语言添加新内容时,您会尝试使它们适合现有的语法,语法和语义,并尝试使现有代码继续工作.因此,您不希望更改语法以使"x34"成为十六进制数或"o34"成为八进制数.

那么,你如何在这个语法中加入八进制数字?有人意识到,除"0"外,不需要以"0"开头的数字.没有人需要为123写"0123".因此我们使用前导零来表示八进制数字.

那十六进制数字呢?您可以使用后缀,因此"34x"表示34 16.然而,解析器必须一直读到数字的末尾才知道如何解释数字(除非它遇到"a"到"f"数字之一,这当然表示十六进制).在解析器上"更容易"知道数字是早期的十六进制.但是你仍然必须从一个数字开始,并且已经使用了零技巧,所以我们还需要其他东西.选择了"x",现在我们有十六进制的"0x".

(以上是基于我对解析的理解和关于语言开发的一般历史,而不是基于编译器开发人员或语言委员会做出的具体决策的知识.)