何时使用八进制?

42

我经常看到二进制和十六进制的使用,但几乎没有看到过八进制。然而,八进制在某些编程语言中有它自己的约定(即前导 0 表示八进制)。那么什么时候会使用八进制呢?有哪些典型情况下使用八进制或八进制更容易理解?还是说这只是个人口味问题?

9个回答

46

八进制用于字长为3的倍数的计算机系统,或将位分组成3位一组时有意义的情况。例如:

  • 18比特字长的古老系统(大多已经历史)
  • 9比特字节的系统(大多已经历史)
  • Unix文件权限有9位(3*3位,“rwxr-x---”0750)
  • Unix文件权限有12位(与9位版本相同,但在前面添加了三个位用于setuid、setgid和sticky,01777,但这里的字母更复杂)

在我从事 IT 工作的约 25 年中,我没有遇到过除 Unix 文件权限位之外的八进制用途。

然而,如果您的字长是4的倍数,请务必使用十六进制。


这是一个无关答案。按照其定义,数字系统并不是“被使用”的。问题要求提供八进制被应用的例子。 - Phil

25

八进制被用作UNIX系统上文件权限的简写表示。例如,文件模式rwxr-xr-x将会是0755


2
但是由于这些值只从0到7,技术上它不是与十进制或十六进制相同吗? - Neil N
1
不行,因为在十进制中还有8和9等数字。 - Matti Virkkunen
4
不行,因为这两个会给你不同的数字值--0x755在二进制中是011101010101,而0755则是111101101。前者在Unix文件权限中的意义完全不同。 - SamB
1
啊,我一直以为每个数字都是单独应用的。当然,“755”与它的十进制对应数字非常不同。 - Neil N

7

八进制在语法上是一个过时的遗物,也许在一些平台上它曾经有意义(系统字并不总是8位的倍数)。现在使用十六进制更为常见。


7

八进制曾经更常用的主要原因是它比十六进制更容易在脑中将其转换成二进制:你只需要记住8个八进制数字(0-7)的二进制表示。

回到那些调试意味着从一行LED灯读取寄存器内容或使用一组切换开关输入数据的日子,这是一个大问题。许多早期计算机的面板将LED和开关分为三组以方便进行此操作。

然而,随着字长为8位字节倍数的胜出以及在控制台文本UI和后来的GUI调试器中读取和输入数据变得不必要,十六进制开始赢得了胜利。


6

4
如果鸟能数数,我猜它们会使用八进制。虽然大多数鸟类在羽毛“手”上有3个数字,但大多数是四趾,即每只脚4个脚趾。

2
哦,还有米老鼠,哈哈;-) - Digital Trauma

3

在航空电子学中,ARINC 429单词标签几乎总是以八进制表示。


1

音乐,只要你远离(大多数)升降号。


1
什么?一个“传统”的(即在钢琴上)八度有12个音符。12个。不是7个。而且你无论如何都不能避免半音和降半音在任何稍微认真的事情中。 - SigTerm
1
音阶上有12个音符,但是在七声音阶上只有7个。音符按照七声音阶的A-G进行标记,这也是一个八进制的编号系统。唱名也沿着七声音阶进行。当然,其他5个半音需要额外的标记来表示,但是OP提问的是八进制编号的用途,而不是信息论,当然代表音乐需要超过3位。 - richardtallent

0

顺便提一下,有几个地方在 Windows 和 JavaScript 中会自动将以零为前缀的数字视为八进制并转换该数字。

在 Windows 中,如果你 ping 一个地址如 10.0.2.010,它实际上会 ping 到 10.0.2.8。

如果你将其输入为计算机的 IP/DNS 地址,Windows 也会这样做。

虽然已经被弃用,但是在某些函数(如 parseInt)中,如果你没有指定基数,JavaScript 默认会这样做 http://www.w3schools.com/jsref/jsref_parseint.asp


任何使用Windows套接字inet_addr()的程序都会表现出这种记录下来的行为。 - Brian Nixon
看来 Perl 也是如此。 - ruffin
C语言中,数字字面量以八进制表示时需要在前面加上“0”前缀,这种方式在语言本身和标准库中都是如此。因此,像Windows这样的操作系统继承了这种行为并不奇怪。 - Cody Gray

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接