【问题标题】:What are octal numbers (base 8) used for?八进制数(以 8 为基数)用于什么?
【发布时间】:2020-02-23 11:54:12
【问题描述】:

Java 提供了以 2、8、10 和 16 为基数编写数字文字的方法。

我想知道为什么包含 base 8,例如int x = 0123;?

我认为可能存在类似于十六进制一个字节的容量是 FF+1 的事实,依此类推。

【问题讨论】:

  • 我相信您的问题是“八进制数的用途是什么?”
  • 是的,我应该这样表述这个问题。感谢所有有趣的答案。我认为它可能有历史基础,但我没有必要的经验来指出它。

标签: java literals octal


【解决方案1】:

这个答案是为原始问题写的,"Why is writing a number in base 8 useful?"

这是为了让那些知道 C 等的人熟悉该语言。那么问题是为什么要在那些人中支持它!

有些架构(各种 PDP)使用 18 bit wide words(还有一些使用 36 位字),因此数字为 3 位宽的文字会很有用。

实际上,我在 Java 代码中看到它的唯一用途是指定 unix 样式的权限,例如07770644

(对为什么支持它的半开玩笑的回答是“在this question 上获得投票”)。

【讨论】:

  • 哦,很好,我忘记了 Linux 中的文件权限!最少使用可用位...八进制符合要求。
  • @sarlacii "minimal use" 与它无关,int 文字的"八进制"-ness 仅存在于源代码中。用八进制文字表示的权限更容易理解,因为数字直接对应于用户、组和其他。
  • 我在一台有 60 位字和 6 位字符集的大型计算机上进行了第一次编程。地址为 18 位。当然,我们使用八进制。当我第一次遇到十六进制时,在数字中看到字母是很奇怪的。
  • @Andy 我仍然认为它是最小的用途......位长度的选择不仅与代码相关。它也受到资源的限制。例如。我可能会选择使用 8 位对每个权限进行编码,屏蔽未使用的位,需要 3 个字节,或者更确切地说使用最小的 3 位,然后对八进制数进行编码,只使用 1 个半字节(使用第 4 个字节)有点粘)。但是,是的,一旦你进入位级别,它就是任意的......因为无论如何你都可以将组合的八进制值读取为十六进制。
【解决方案2】:

"八进制数已经不像以前那么普遍了。但是当一个字的位数是 3 的倍数时使用八进制数。它在 UNIX 系统上也用作表示文件权限的简写以及 UTF8 数字的表示等。”

发件人:https://www.tutorialspoint.com/octal-number-system

【讨论】:

  • 并不是真正的“一个字的位数”——因为它在 16 位小型计算机上以高位 0/1 和 5 个八进制数的形式使用。更好的描述可能是:当一个字中的 field 的大小是 8 位的倍数时使用。那些相同的计算机(通常)有 8 个寄存器 - 因此指令中指定的寄存器将具有 3 位字段来命名寄存器,寄存器到寄存器指令将具有两个这样的 3 位字段;那些相同的计算机经常有一个 3 位操作码,或一个带有“转义”(例如 0111)到 6 位操作码的 3 位操作码;等等等等。
【解决方案3】:

计算机的历史(科学)。为了表示一个基数 10 不适合的位组,基数 8 = 23 表示 3 位,基数 16 = 24 表示 4 位更适合。

以 8 为底的优点是所有数字都是真正的数字:0-7,而以 16 为底的“数字”是 0-9A-F。

对于以 16 为基数的 8 位字节(十六进制)更合适,并且获胜。对于 Unix base 8 八进制,通常仍用于rwx 位(读取、写入、执行),用于用户、组和其他人;因此像 0666 或 0777 这样的八进制数。

十六进制无处不在,尤其是因为当今计算机的字长 多个字节。 8 位 byte 成为标准是另一个艰难的相关故事(23 位和寻址)。

【讨论】:

    【解决方案4】:

    “八进制数(以 8 为基数)用于什么?”的原始答案

    八进制的常用用法

    • 作为二进制的缩写: 对于计算机(如 UNIVAC 1050、PDP-8、ICL 1900 等),八进制一直被用作二进制的缩写,因为它们的字长可以被三整除(每个八进制数字代表三个二进制数字)。因此,两位、四位、八位或十二位数字可以简洁地显示整个机器字。它还通过允许将数码管、七段显示器和计算器用于操作员控制台来降低成本,其中二进制显示器过于复杂而无法使用,十进制显示器需要复杂的硬件来转换基数,而十六进制显示器需要显示更多的数字.

    • 16、32 或 62 位字表示:所有现代计算平台都使用 16、32 或 64 位字,进一步分为 8 位字节.在这样的系统上,每个字节需要三个八进制数字,最高有效八进制数字代表两个二进制数字(加上下一个有效字节的一位,如果有的话)。 16 位字的八进制表示需要 6 位数字,但最高有效八进制数字仅表示(非常不雅)一位(0 或 1)。这种表示无法轻松读取最高有效字节,因为它被涂抹在四个八进制数字上。因此,十六进制在今天的编程语言中更常用,因为两个十六进制数字正好指定一个字节。某些具有 2 次方字长的平台仍然具有指令子字,如果以八进制显示则更容易理解;这包括 PDP-11 和摩托罗拉 68000 系列。现代无处不在的 x86 架构也属于这一类,但八进制很少在这个平台上使用。

    • 编码描述:现代 x86 架构中操作码的二进制编码的某些属性在以八进制显示时变得更加明显,例如ModRM 字节,分为 2、3 和 3 位字段,因此八进制可用于描述这些编码。

    • 计算和文件访问权限: 八进制有时用于计算而不是十六进制,也许在现代最常与 Unix 系统下的文件权限结合使用(在对 chmod 的权限访问中) .它的优点是不需要任何额外的符号作为数字(十六进制系统是 base-16,因此需要 0-9 之外的六个额外符号)。

    • 数字显示:八进制数也用于在屏幕上显示数字内容,因为它用于表示的符号数量较少。

    • 字节字符串的图形表示:一些编程语言(C、Perl、Postscript 等)以八进制表示文本/图形,转义为 \nnn。八进制表示对于 UTF-8 的非 ASCII 字节特别方便,它编码 6 位组,其中任何起始字节的八进制值为 \3nn,任何连续字节的八进制值为 \2nn。

    • 早期浮点算法:八进制也用于浮点数在 Ferranti Atlas (1962)、Burroughs B5500 (1964)、Burroughs B5700 (1971)、Burroughs B6700 ( 1971) 和 Burroughs B7700 (1972) 计算机。

    • 在应答器中: 飞机在被地面雷达询问时发送一个代码,以四位八进制数字表示。此代码用于在雷达屏幕上区分不同的飞机。

    进一步阅读:https://en.wikipedia.org/wiki/Octal

    【讨论】:

    • 我喜欢阅读 Wikipedia 条目,尤其是关于使用手指之间的空间来计数的部分。但是,在大多数情况下,这篇文章可以说是我提出问题的动力。正如我所怀疑的那样,当前计算机体系结构中使用的字长的不可分割性使得八进制表示没有用,您引用的段落之一是“16 位、32 位、64 位字……”根本不清楚。您能否解释一下“最高有效字节被涂抹在四个八进制数字上”和“一些具有 2 次方字大小的平台仍然有指令子字......”
    猜你喜欢
    • 2018-05-04
    • 1970-01-01
    • 2012-07-14
    • 2015-08-16
    • 2011-07-09
    • 1970-01-01
    • 1970-01-01
    • 2010-09-07
    相关资源
    最近更新 更多