【问题标题】:Octal number literals: When? Why? Ever? [closed]八进制数字文字:什么时候?为什么?曾经? [关闭]
【发布时间】:2010-09-07 20:35:10
【问题描述】:

我从未在我的代码中使用八进制数,也没有遇到任何使用它的代码(尽管是十六进制和位旋转)。

我在 1994 年左右开始使用 C/C++ 进行编程,所以我可能还太年轻,无法做到这一点?旧代码是否使用八进制? C 通过在前面加上 0 来支持这些,但是使用这些以 8 为基数的数字文字的代码在哪里?

【问题讨论】:

  • 我一直使用它们(以八进制零的形式):if (b < 0) b = 0;
  • @pmg:我想知道将 0q1234 定义为非零八进制常量的“正确”格式是否有任何困难,并明确贬低 01234 并建议编译器生成非致命的诊断?实际上,我希望看到的是基于位的通用格式 0[[x[0-9A-Fa-f]+]|[q[0-7]+]|[w[0-3] +]|[v[0-1]+]]+ 允许混合 1-4 位字段,因为 3 位字段并不总是从右侧对齐 3 位的倍数。
  • 巧合的是,这个问题今天终于出现在 SO 的首页(有人添加了答案),Raymond Chen 今天也碰巧发了一篇关于八进制混乱的文章:The curse of the leading zero
  • 我看到的唯一用途是在定义文件 open() 标志和权限时,因为它们通常是从标准参考中复制而来的。但即使在这些情况下,它们也比整数文字的十进制甚至二进制表示更有帮助。
  • @supercat Python 3 这样做 - 八进制常量的形式为 0o1234,而旧的 01234 形式给出了语法错误。

标签: c numbers


【解决方案1】:

我最近不得不编写访问 3 位字段的网络协议代码。当你想调试它时,八进制会派上用场。

为了效果,你能告诉我这个的 3 位字段是什么吗?

0x492492

另一方面,这个相同的八进制数:

022222222

现在,最后,以二进制形式(3 个一组):

010 010 010 010 010 010 010 010

【讨论】:

  • 我在 Programmers Exchange 上的一个类似问题中提到了您的答案并对其进行了扩展,也许对八进制感兴趣的其他人感兴趣:programmers.stackexchange.com/questions/98692/…
  • 正确,但它们通常仅用于使用 3 位组或其倍数的现有协议。任何新代码和协议通常使用 nybbles 或其倍数,通常以十六进制表示。
  • @mirabilos 这是一个相当广泛的声明。没有理由将字段长度锁定为 4 位或 8 位的倍数 - 事实上,排除其他长度会导致协议中的大量开销。也许对于一些无关紧要的应用程序,但是支持性能真正重要的应用程序的协议呢?在这些情况下,您不会选择 4 位字段而选择 3 位字段。
  • @BenCollins “通常”并不意味着“总是,不惜一切代价”。我认为协议开发人员的想法是明智的。尽管如此,现代事物(过去几十年……)倾向于使用十六进制而不是八进制。
【解决方案2】:

这些天我遇到八进制文字的唯一地方是在 Linux 中处理文件的权限位时,通常表示为 3 个八进制数字,其中每个数字分别代表文件所有者、组和其他用户的权限.

例如0755(在大多数命令行工具中也只是 755)表示文件所有者拥有完全权限(读、写、执行),而组和其他用户只有读和执行权限。

用八进制表示这些位可以更容易地确定设置了哪些权限。 0755 的含义一目了然,但 493 或 0x1ed 却不知道。

【讨论】:

【解决方案3】:

来自Wikipedia

八进制的时候 广泛应用于计算机领域, IBM大型机等系统 采用 24 位(或 36 位)字。 八进制是理想的缩写 这些机器的二进制文件,因为 八(或十二)位数字可以 简洁地展示整台机器 单词(每个八进制数字覆盖三个 二进制数)。它还削减了成本 允许数码管,七段 显示器和要使用的计算器 用于操作员控制台;在哪里 二进制显示太复杂了 使用,十进制显示需要复杂 用于转换基数的硬件,以及 需要显示的十六进制显示 字母。

所有现代计算 但是,平台使用 16-、32- 或 64 位字,8 位 一个字节。在这样的系统上,三个八进制 数字将是必需的,与 最高有效八进制数 不雅地只代表两个 二进制数字(以及一系列 相同的八进制数字代表一个 下一个字节的二进制数字)。 因此十六进制更常见 今天在编程语言中使用, 因为一个十六进制数字包含四个 二进制数字和所有现代计算 平台的机器词是 能被四整除。一些 具有两个单词的幂的平台 size 仍有指令子字 更容易理解,如果 以八进制显示;这包括 PDP-11。现代无处不在的 x86 建筑属于这一类 也一样,但八进制几乎从不 在这个平台上使用。

-亚当

【讨论】:

    【解决方案4】:

    我从来没有在我的 代码也不会遇到任何代码 用过。

    我敢打赌你有。根据标准,以零开头的数字文字是八进制的。这包括0。每次您使用或看到文字零时,它都是八进制的。奇怪但真实。 :-)

    【讨论】:

    • 事实上这不是真的。八进制以“0”作为指示符开始。就像“0x”不是有效数字一样,“0”也不是八进制数。 '00' 是。
    • 我想你可能弄错了。 ISO/IEC 9899:201x 的第 6.4.4.1 节指定了文字常量可以采用的形式,0 明确列为八进制常量。此外,十进制常量不能以零开头。您可以在线查看该标准的草案here
    • @LucBloom 0 实际上八进制。见Is 0 a decimal literal or an octal literal?
    • 我们可以说文字 0 只是根据词汇定义的八进制数,但实际上数字 0 同时在所有可能的基数中表示。或者可能什么都没有。
    • @Petruza all 数字仅在其给定的词汇表示中处于特定的基础中。一旦被解析,它就没有任何基础了。
    【解决方案5】:

    商业航空在古老的 Arinc 429 总线标准中使用八进制“标签”(基本上是消息类型 ID)。因此,在为航空电子应用程序编写代码时能够以八进制指定标签值真是太好了……

    【讨论】:

      【解决方案6】:

      我还看到飞机应答器中使用了八进制。模式 3a 应答器代码是一个 12 位数字,每个人都将其处理为 4 个八进制数字。 Wikipedia 有更多信息。我知道这通常与计算机无关,但 FAA 也使用计算机 :)。

      【讨论】:

      • 我认为这样做是为了让几十年前的航空电子设备受益,您将代码放在四个指轮上,这些指轮直接将 12 位值编码为简单的数字逻辑以进行顺序传输。没有涉及微处理器,因为他们没有微处理器(或者不想要航空电子应用程序的复杂性)。
      【解决方案7】:

      它对于 Unix 领域的 chmodmkdir 函数很有用,但除此之外我想不出任何其他常见用途。

      【讨论】:

        【解决方案8】:

        我是通过PDP-11 接触到 Octal 的,显然 C 语言也是如此:)

        【讨论】:

        • 啊,PDP11;我仍然记得很多编码: 010446 = MOV R4,-(SP) since 01xxxx = mov; 04=R4; 46 = -(SP)。
        【解决方案9】:

        60 年代末和 70 年代仍然有一堆旧的过程控制系统(霍尼韦尔 H4400、H45000 等)被安排使用 24 位字和八进制寻址。以美国建造最后一座核电站的时间为例。

        替换这些工业系统是一项相当艰巨的任务,因此您可能很幸运能够在它们灭绝之前在野外遇到一个,并惊叹于它们宏伟的自定义浮点格式!

        【讨论】:

        • 漂亮的 gravatar... 你让我到了那里。
        【解决方案10】:

        tar 文件将信息存储为八进制整数值字符串

        【讨论】:

        • 它是整数(不是十进制也不是八进制)还是字符串
        • @vonbrand 它们是八进制字符串。
        【解决方案11】:

        没有世俗的理由来修改可以追溯到语言诞生并且存在于无数程序中的标准。我仍然记得他们的 ASCII 字符 八进制值,必须考虑得出 A 的十六进制值,但它是八进制的 101;数字 0 是 060... ^C 是 003...

        也就是说,我经常使用八进制表示。

        现在,如果您真的想折腾自己的矿,请查看 PDP-10 的文字格式...

        【讨论】:

          【解决方案12】:

          任何学会在 PDP-8 上编程的人都会对八进制数感到温暖。字长为 12 位,分为 4 组,每组 3 位,所以 -1 是 7777 八进制。这种方案在 PDP-11 中得到延续,它有 16 位字,但仍然使用八进制表示各种事物,因此*NIX 文件权限方案一直存在。

          【讨论】:

            【解决方案13】:

            八进制对第一个可用的显示硬件(7 段显示器)最有用。这些原始显示器后来没有可用的解码器。

            因此,数字寄存器输出被分组以适应只能显示八 (8) 个符号的可用显示器:0,1,2 3,4,5,6,7。

            第一个 CRT 显像管是光栅扫描显示器,最简单的字符符号发生器相当于 7 段显示器。

            与往常一样,激励驱动程序是最便宜的显示器。

            【讨论】:

            • 澄清一下:您当然可以在 7 段显示器上显示十六进制数字;你是说问题是为了降低编码器的复杂性吗?添加更多数字真的比添加更多逻辑更便宜吗?
            猜你喜欢
            • 2014-09-06
            • 2011-07-09
            • 1970-01-01
            • 2021-11-12
            • 1970-01-01
            • 2010-09-06
            • 2012-02-12
            相关资源
            最近更新 更多