八进制/十六进制符号来自哪里? [关闭]

问题描述 投票:15回答:7

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

  • 指定您的十进制数字通常会
  • 用前导0指定八进制数
  • 用前导0x指定十六进制数

为什么为0?为什么是0x? base-32是否自然发展?

c hex octal
7个回答
17
投票

C是C ++和Java的始祖,最初是由Dennis Richie在70年代初期由PDP-8开发的。这些机器具有12-bit address space,所以指针(地址)长12位,并且在代码中最方便地用四个3位八进制数字表示(第一个可寻址字为0000八进制,最后一个可寻址字为7777八进制)。

八进制不能很好地映射到8位字节,因为每个八进制数字代表三位,因此,在八进制表示法中总是存在可表示的多余位。全TRUE字节(1111 1111)的八进制为377,而十六进制的FF。

对于大多数人来说,十六进制更容易在他们的头脑中与二进制进行转换,因为二进制数通常以八位为一组来表示(因为这是一个字节的大小),而八位恰好是两个十六进制数字,但是十六进制表示法将具有在Dennis的时代一直很笨拙并且具有误导性(这意味着能够处理16位)。程序员在使用硬件(每个位通常代表一条物理线路)和使用逐位逻辑(每个位具有程序员定义的含义)时,需要用二进制的方式思考。

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

我相信稍后会在C中添加十六进制符号0x__。编译器解析树以将1-9(十进制常数的第一位),0(八进制常数的第一[无意义]数字)和0x(指示在随后的数字中跟随的十六进制常数)彼此区分开来要好得多。比仅使用前导0作为指示符来从将后续数字解析为八进制而不是十进制切换更为复杂。

丹尼斯为什么设计这种方式? Contemporary programmers不了解那些早期的计算机通常是通过物理翻转CPU前面板上的开关或用打孔卡或纸带来切换指令到CPU来控制的;节省一些步骤或说明的所有环境都意味着节省了大量的体力劳动。而且,内存有限且昂贵,因此即使保存几条指令也具有很高的价值。

摘要:八进制为0,因为它可以有效解析并且八进制在PDP-8上对用户友好(至少用于地址操作)

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


8
投票

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

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


5
投票

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

[惯例中,变量名和其他标识符以字母(或其他一些符号,下划线或美元符号)开头。因此,“ a”,“ abc”和“ a04”都是名称。数字以数字开头。因此,“ 3”和“ 3e5”是数字。

当您将新事物添加到编程语言中时,您试图使其适应现有的语法,语法和语义,并尝试使现有代码继续工作。因此,您不想更改语法以使“ x34”为十六进制数或“ o34”为八进制数。

因此,您如何将八进制数字放入此语法中?有人意识到,除了“ 0”外,不需要以“ 0”开头的数字。没人需要为123写“ 0123”。因此,我们使用前导零表示八进制数字。

十六进制数字呢?您可以使用后缀,以便“ 34x”表示34 16。但是,解析器必须在知道如何解释数字之前,一直读取到数字的末尾(除非它遇到“ a”至“ f”数字之一,这当然表示十六进制)。在解析器上“更轻松”地知道数字早于十六进制。但是您仍然必须以数字开头,并且已经使用了零技巧,因此我们需要其他一些东西。选择了“ x”,现在十六进制为“ 0x”。


3
投票
我不知道...

0代表0ctal

0x表示,嗯,我们已经使用0表示八进制了,十六进制中也有一个x,所以在其中也是如此

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

123_27(将_解释为下标)

依此类推

标记


2
投票
base-32是否自然发展?

这是Ada使用16#形式引入十六进制常量,8#表示八进制,2#表示二进制等的原因的一部分>]

不过,我不会因为需要更多空间来进行“未来的增长”。这不像RAM或寻址空间,在每一代您都需要更多数量级。

实际上,研究表明,八进制和十六进制几乎是二进制兼容的人类可读表示的

最佳点

。如果您输入的数字比八进制数字小,则它开始要求使用多余的数字来表示较大的数字。如果比十六进制高,那么数学表将变得非常大。十六进制实际上已经有点太多了,但是八进制存在一个问题,即它不能均匀地容纳在一个字节中。

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

-1
投票
我认为它0x实际上是在UNIX / Linux世界中出现的,并被C / C ++和其他语言所采用。但我不知道确切原因或真实来源。
© www.soinside.com 2019 - 2024. All rights reserved.