【问题标题】:Should implicit octal encoding be removed or changed in programming languages?是否应该在编程语言中删除或更改隐式八进制编码?
【发布时间】:2010-11-19 18:59:23
【问题描述】:

我在看this 的问题。基本上有一个前导零会导致数字被解释为八进制。我用多种语言多次遇到这个问题。

为什么该语言不明确要求您使用函数调用或类型(在强类型语言中)指定八进制,例如:

oct variable = 2;

我可以理解为什么十六进制 (0x0234) 有这种格式。十六进制非常有用。数据库中的整数永远不会有 x。

但是八进制数 0123 看起来像整数,处理起来很麻烦。我从来没有用过八进制。

谁能解释这种用法背后的基本原理?是不是有点历史遗留问题?

【问题讨论】:

    标签: language-agnostic types


    【解决方案1】:

    是的,这是历史性的。 C 使用这种方式来指定八进制的文字,并且可能在此之前的某个地方使用过。

    我在 Javascript 中体验过,其中解析日期在 8 月停止工作。截至 7 月,它的工作原理是 '07' 解析为八进制仍然是 7,但 '08' 不是有效数字...(解决方案是在 parseInt 调用中指定数字基数。)

    在 C# 中没有二进制或八进制字面量,也许原因是您不应该为语言需要它做太多的摆弄......

    【讨论】:

      【解决方案2】:

      就个人而言,我在这种情况下责怪程序员。为什么要通过零填充格式化整数?零填充适用于字符串,而不是数字类型。

      【讨论】:

      • 如果你认为这是一个古怪的决定,你应该看看我维护的一些代码。
      • 我可以看到零填充数字,但在字符串中。
      • 编译器应该让程序员的生活更轻松,而不是相反。
      • 一个编译器应该弥补程序员不知道基本的数字数据类型?
      • 在脚本语言中,您可以从数据库的零填充字段中提取数据。它在内部不是字符串,而是存储为八进制数。这是数据传入时的问题,而不是您在代码中键入时的问题。
      【解决方案3】:

      我也讨厌这个,我不知道为什么它会被带到这么多现代语言中。我曾经认识一个住在纽约的人,他的邮政编码像“09827”。有时他必须将邮政编码输入为“9827”,因为前导零会导致错误消息(因为 9 和 8 是八进制数中的非法字符)。

      【讨论】:

        【解决方案4】:

        它的存在是因为使用 3 位段几乎与使用 4 位段一样有用。这在过去更是如此(e.g., seven-segment LEDs, chmod, etc.)。

        真正的问题是为什么没有更多的语言以更常规的方式采用八进制和二进制表示法:

        10 == 0b1010 == 0o12 == 0x0A
        

        我知道 Python 最终采用了 0o8 表示法...不确定他们是否也采用了二进制表示法。我想一个更好的问题是为什么这仍然会让人绊倒?

        【讨论】:

        • 因为八进制很少使用以至于人们忘记了它们,所以它会让人绊倒
        • Python 从 2.6 / 3.0 开始采用 0b 和 0o 前缀
        【解决方案5】:

        它存在的 99.9% 的原因是支持chmod() 调用,即chmod(fd, 0755)。

        看起来更像十六进制的格式会更好。

        【讨论】:

        • 哈!我想我用八进制做某事:)
        【解决方案6】:

        这在很大程度上是历史性的。我见过的最好的解决方案是在新版本的 Python 中,其中八进制用一个特殊的前缀字符“o”表示,很像十六进制的“x”前缀:

        0o10 == 0x8 == 8
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2012-01-13
          • 2018-08-09
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多