八进制/hex符号来自哪里?

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

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

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

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

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

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

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

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

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

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

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

八进制的零前缀和hex的0x来自Unix的早期。

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

“新”数字必须以数字开头,以使用现有语法。

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

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

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

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

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

我不知道 …

0表示0ctal

0x是的,好吧,我们已经使用0来表示八进制,并且有一个hex的x,所以在那里也是

至于自然进展,最好看看可以附加下标的最新编程语言

123_27(解释_表示下标)

等等

标记

基础-32有自然进展吗?

这是Ada使用16#forms引入hex常量,8#为八进制,2#为二进制等的部分原因。

尽管如此,我不会过多地关注需要空间来“未来增长”。 这不像RAM或寻址空间,您需要每代更多的数量级。

事实上,研究表明,八进制和hex几乎是二进制兼容的人类可读表示的最佳位置 。 如果你低于八进制,它开始需要一个简洁的数字来表示更大的数字。 如果你高于hex,数学表会变得非常大。 Hex实际上已经有点太多了,但Octal的问题在于它不能均匀地适合一个字节。

Base32有一个标准编码。 它与Base64非常相似。 但阅读起来并不方便。 使用hex是因为2个hex数字可用于表示1个8位字节。 八进制主要用于使用12位字节的旧系统。 与将原始寄存器显示为二进制相比,它使数据表示更紧凑。

还应该注意的是,有些语言使用o ###表示八进制,x ##或h ##表示hex,以及许多其他变体。

我认为它实际上来自UNIX / Linux世界,并且被C / C ++和其他语言所接受。 但我不知道确切的原因或真正的起源。