代码之家  ›  专栏  ›  技术社区  ›  John

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

  •  13
  • John  · 技术社区  · 16 年前

    毕竟,我从来没有想过要问这个问题,我知道这是来自C++,但背后的推理是什么:

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

    为什么是0?为什么是0X?BASE-32是否有自然进展?

    7 回复  |  直到 13 年前
        1
  •  16
  •   user14517    13 年前

    C,C++和Java的祖先,最初是由Dennis Richie在70年代初在PDP8S上开发的。 12-bit address space ,所以指针(地址)是12位长,最方便地用3个4位八进制数字(第一个可寻址字是000八进制,最后一个可寻址字是777八进制)在代码中表示。

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

    十六进制对大多数人来说更容易在他们的大脑中转换为二进制,因为二进制数字通常用八个字节(因为这是一个字节的大小)来表示,而八个恰恰是两个十六进制数字,但是十六进制符号在丹尼斯的时间里会显得笨拙和误导(意味着能够处理16位)。程序员在处理硬件(每个位通常代表一条物理线)和位逻辑(每个位都有程序员定义的含义)时,需要用二进制来思考。

    我认为丹尼斯在日常的十进制数字中添加了0前缀,这是最简单的变化,对于早期的解析器来说也是最容易区分的。

    我相信十六进制符号0x_uuu是在稍后添加到c中的。编译器解析树来区分1-9(十进制常量的第一位)、0(八进制常量的第一[不重要]位)和0x(表示十六进制常量后接数字),这比仅使用前导0作为指示器来切换将后续数字解析为八进制比率要复杂得多。比小数高。

    丹尼斯为什么要这样设计? Contemporary programmers 不要欣赏那些早期的计算机通常是通过物理地翻转CPU前面板上的开关,或使用穿孔卡或纸带将指令切换到CPU来控制的;所有节省几步或指令的环境都代表着节省大量人工劳动。而且,内存有限且昂贵,因此即使保存一些指令也有很高的价值。

    综上所述: 0代表八进制,因为它是高效可解析的,八进制在PDP-8S上是用户友好的(至少用于地址操作)

    对于十六进制,可能是因为它是八进制前缀标准的自然向后兼容扩展,而且解析起来仍然相对高效。

        2
  •  7
  •   Jim Garrison    16 年前

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

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

        3
  •  5
  •   Eric Postpischil    13 年前

    _156;new_157;数字必须以数字开头,才能使用现有语法。

    已建立的实践有变量名和其他标识符,以字母(或其他一些符号,可能是下划线或美元符号)开头。因此,a_,_ abc_,和a04_都是名字。数字以数字开头。因此,__3_和__3e5_是数字。

    当您向编程语言中添加新的东西时,您会设法使它们与现有的语法、语法和语义相匹配,并尝试使现有的代码继续工作。因此,您不希望更改语法使__x34_157;成为十六进制数字或__o34_157;成为八进制数字。

    那么,如何将八进制数字放入这个语法中呢?有人意识到,除了__0__之外,不需要以_0__开头的数字。没有人需要为123写__0123__。所以我们用前导零来表示八进制数字。

    十六进制数字呢?您可以使用后缀,因此__34x_表示34 十六 . 但是,在解析器知道如何解释数字之前,它必须一直读到数字的末尾(除非遇到一个A到F数字,这当然表示十六进制)。解析器上更容易知道数字是十六进制的。但是你还是要从一个数字开始,零技巧已经被使用了,所以我们需要一些其他的东西。__x_被选中,现在我们有__x_用于十六进制。

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

        4
  •  3
  •   High Performance Mark    16 年前

    我不知道…

    0是0cTAR

    我们已经用了0来表示八进制,还有一个十六进制的x,所以这里也没有。

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

    123_27(解释为下标)

    等等

    ?

    作记号

        5
  •  2
  •   T.E.D.    14 年前

    BASE-32是否有自然进展?

    这就是为什么Ada使用16形式引入十六进制常量、8表示八进制、2表示二进制等的部分原因。

    不过,我不会太担心在基地建设中需要“未来增长”的空间。这不像RAM或寻址空间那样,每代人都需要一个数量级以上的空间。

    事实上,研究表明,八进制和十六进制几乎是 甜点 用于二进制兼容的人类可读表示。如果比八进制低一点,就需要一个不可计算的数字来表示更大的数字。如果超过十六进制,数学表就会变得异常大。十六进制实际上已经有点太多了,但八进制有一个问题,即它不能均匀地适应一个字节。

        6
  •  1
  •   Matthew Whited    16 年前

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

    还应注意的是,有些语言使用O表示八进制,X或H表示十六进制,以及许多其他变体。

        7
  •  -1
  •   J.Hendrix    16 年前

    我认为 0x 实际上是为UNIX/Linux世界而来的,是用C/C++和其他语言学习的。但我不知道确切的原因或真正的起源。