应该在编程语言中删除或更改隐式八进制编码吗?

时间:2009-08-14 20:50:50

标签: language-agnostic types

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

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

oct variable = 2;

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

但八进制数字0123看起来像是整数并且很难处理。我从未使用过八进制文件。

任何人都可以解释这种用法背后的理由吗?这只是一个历史遗留的吗?

6 个答案:

答案 0 :(得分:5)

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

0o10 == 0x8 == 8

答案 1 :(得分:2)

99.9%的原因是支持chmod()次来电,即chmod(fd, 0755)

看起来更像十六进制的格式似乎更优越。

答案 2 :(得分:2)

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

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

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

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

答案 3 :(得分:1)

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

我在Javascript中遇到过它,解析日期在八月份停止工作。直到7月,它解析为'07',因为八进制仍然是7,但'08'不是有效数字...(解决方案是在parseInt调用中指定数字基数。)

在C#中没有二进制文件或八进制文字,也许推理是你不应该做那些语言需要它的小小的... ...

答案 4 :(得分:1)

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

答案 5 :(得分:-1)

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