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

时间:2009-12-02 20:10:24

标签: c hex octal

在这段时间之后,我从未想过要问这个问题;我知道这来自c ++,但背后的原因是什么:

  • 指定十进制数字 通常会
  • 按前导0
  • 指定八进制数
  • 通过前导0x
  • 指定十六进制数字

为什么是0?为什么是0x?基础-32是否存在自然进展?

7 个答案:

答案 0 :(得分:16)

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

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

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

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

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

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

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

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

答案 1 :(得分:7)

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

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

答案 2 :(得分:5)

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

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

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

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

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

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

答案 3 :(得分:3)

我不知道......

0代表0ctal

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

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

123_27(解释_表示下标)

等等

标记

答案 4 :(得分:2)

  

base-32有自然进展吗?

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

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

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

答案 5 :(得分:1)

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

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

答案 6 :(得分:-1)

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