八进制在哪里有用?[关闭]


36

我只是把头撞在桌子上约20分钟,看着一个完全奇怪的PHP错误,然后我意识到这是八进制的。<%(*&#>八进制。

简而言之,我用零填充了一些文字,所以代码会对齐,我知道这是个大错误。忘记八进制了。

问题是,除了文件权限之外,是否有人将八进制用于其他用途?(我个人更喜欢,chmod ugo+rwx但我知道如果必须以编程方式生成它们,则使用八进制是有用的。)但是,它们在任何其他情况下都有用吗?


16
选项A:怪自己。选项B:责备世界。选项C:在学到一些东西时会轻笑。
工作

12
@Petrozza-IMO的C样式使用前导零表示八进制从来都不是一个好选择,但这是历史-可能是C的传统,尽管它可能更旧。我认为Ada有更好的约定之一-八进制数字将写为8#1234567#,十六进制数字为16#abcdef#,依此类推,而前导零只是前导零-从2到16(至少)的任何基数都有效,并且所有内容在视觉上都很明显并且易于理解。
2011年

2
@Petruza您最初提出的问题对该网站没有建设性,社区对此问题进行了改进,使其可以保持打开状态:有关人们为什么这样做以及为什么我们鼓励这样做的更多信息,请参阅FAQ。如果您还有其他问题或疑虑,请在我们的元讨论站点上提出,而不是在您的问题中提出。

11
选项D:无论问题如何,“怪PHP”始终是正确的选择
Cephalopod 2014年

2
@ Steve314我完全同意。另外一个值得注意的例子是Python的,他们有0o前缀(这与一致0x0b但也许有点难以从区分00)。从Python 3开始,多余的前导零会重新引发语法错误,以防止此类错误。
5gon12eder 2015年

Answers:


42

根据Wikipedia的说法,八进制不像以前那样常见。正如其他人已经提到的那样,在过去,系统以前具有12/24/36位字,与十六进制相比,它更容易以八进制表示,但是目前,x86和i64体系结构使用16/32/64位单词,更容易用十六进制表示,而彻头彻尾的丑陋用八进制表示。

但是,当前的用途包括:

请注意,由于缺少用例和潜在的错误,现代编程语言有时有时不再支持八进制。C#是一个示例,正如Eric Lippert在TCPL第三版和第四版中所写的那样

C#不支持八进制文字,有两个原因。首先,这些天几乎没有人使用八进制文字。其次,如果C#以标准的“前导零表示八进制”格式支持八进制,那么它将是潜在的错误源。考虑以下代码:

    FlightNumber = 0541;

显然,此表达式旨在用作十进制文字而不是八进制文字。

相关的代码仅供参考和好奇,计算机硬件的隐藏语言在第55-63页上有一个很好的易于理解的八进制和其他数字系统说明。


1
值得注意的是,在处理用户输入时要当心Javascript。parseInt(011)==9
达里安(Darien)

3
Yuki和Pamean真的很有趣。在我看来,十六进制手指计数相当容易,如果您使用每个手指的内部,并使用一些变化,例如
ocodo 2011年

@Slomojo- 实际上,您的手指上可以算到99,...
不错,

3
+1获得非常全面的答案。格蕾丝·霍珀(Grace Hopper)曾经说过,她在平衡支票簿方面遇到了麻烦,因为她精通八进制。
Macneil

14
@detly,如果我知道我需要计数大数,我将使用10位数字作为位数,并仅用手指数到1024(请小心,您让#4,#128和#132显示给谁)。
zzzzBov 2011年

17

Octal在50年前被Digital Equipment Corp.(DEC)和其他公司使用的计算机使用12位字(例如PDP-8)或其他6的倍数(例如18和36)(例如UNIVAC 1108)广泛使用。 )。我在研究生院同时使用了PDP-8和UNIVAC 1108。两台机器上的字符通常使用6位,而不是8位。

PDP-8指令格式

PDP-8指令格式-请注意,位的编号为0->11。位0是MSB(最高有效位)。

当DEC推出16位PDP-11时,他们继续在文档中使用八进制,而不是当时其他随16位机一起推出的小型计算机制造商所使用的十六进制。这可能是由于PDP-11指令格式中的多个3位字段(例如寄存器,模式和Src / Dest)将自身借出后可以解码为八进制数字。(感谢John Strohm指出这一点。)

有趣的是,当摩托罗拉推出其68000微处理器时,受到PDP-11的严重影响,并且指令中具有相同的3位模式和寄存器字段,他们选择在文档中仅使用十六进制。

由于PDP-11使用八进制表示法,因此最初出现在PDP-11上的Unix原始许可码也使用八进制。这种传统在Linux中仍然存在,在那里chmod命令仍然使用八进制来指定三个位的“ rwx”字段中的每一个。

更琐碎的是-CompuServe,它是在1980年代和1990年代初期(在被AOL取代之前)被广泛使用的拨号在线服务,至少在最初是在DEC微型计算机上运行的。所有用户ID都是数字,在某些时候我观察到它们从未在其中包含任何8或9,因此它们是八进制的。我以前的CIS ID是70205。


1
您对PDP-11文档的评论不正确。PDP-11有8个寄存器。R0-R5是通用寄存器。R6是堆栈指针,R7是PC。MOV指令采用两个3位寄存器号和两个3位寻址模式。八进制完全捕获寄存器和模式字段。(我强烈怀疑这是偶然的。)使用十六进制会混淆所有内容。PUSH和POP只是使用R6的寻址模式。立即操作数是使用R7的寻址模式。
约翰·R·斯特罗姆

@ JohnR.Strohm感谢您对3位寄存器的评论。我同意您的分析,并更新了我的答案。
tcrosley 2014年

因此,DEC在华侨城工作。应该只使用3.32位的倍数以避免混淆。
user234461 '17

有趣的是,我从未将Unix权限视为一个八进制数字,我一直认为它是一起写的三个独立数字,每个数字代表三个rwx位,因此它们可以是八进制,十进制甚至十六进制。
axl

11

Heathkit将它们用于H-8的前面板以及其前面板软件(称为PAM-8)的汇编语言列表。我知道约会。

在此处输入图片说明

如今,八进制非常罕见。每个人似乎都使用十六进制。但是数字仍然看起来像八进制的数字,并且您不需要为数字A到F附加一行键。


2
H-8的+1。尽管外部为八进制,但CPU还是8080A,全都是字节。去吧。
Blrfl 2011年

我猜想他们为H-11(使用PDP-11 CPU)使用了八进制。
杰里·科芬

2
8080具有8位字节,但是如果使用八进制而不是十六进制,则指令集更有意义。
RBerteig

6

八进制使用的原因之一是因为它是2的幂的最大基数,因此您不需要任何特殊字符-也就是说,所有数字都可以是数字。基数16(基数8的下一个)需要非数字(通常是A,B,C,D,E,F)。


我知道这很旧,但是为什么只使用数字比使用字母更好呢?
Petruza

5

我每天都使用八进制。每次我需要对文件进行chmod时,我都使用八进制(我早于u + r表示法...)。每当我想在字符串中嵌入控制字符时,我都会使用八进制...(是的,我可以使用十六进制,但是八进制是我使用的)。


2
+1代表“但我使用八进制” :)
JoelFan 2011年

5

任何需要表达三位分组的组合的人。

为什么有人使用十六进制?


用八进制数字表示的事情超出了我的头脑:

  • 飞机中的3A模式应答器发出的代码
  • 在ARINC 429航空电子总线上找到某些值
  • SCSI地址
  • ncurses库中的关键代码

11
区别在于,十六进制是“自然的”半个字节。两个十六进制数字= 1个字节。但是您不能将字节分成八位数字。
梅森惠勒

2
第一行指出了显而易见的内容。第二个比喻不好。
back2dos

3
对于任何需要以三位为一组的形式表示的东西,例如上述的Unix文件模式,十六进制是完全不自然的。没有法律说特定的编号系统的数字必须与字节对齐。如果有的话,将任何东西表示为以10为基数的计算机,将比以8为基数(至少使自身与位组对齐)的基数差。
Blrfl 2011年

6
典型的十六进制字符串显然是十六进制字符串。八进制不是。
Paul Nathan

1
@Blrfl:那么,除了典范示例之外,还有多少个提到的“ [需要以三位为一组的形式表达的东西”?这是实际的问题,到目前为止您尚未回答。相反,您又做了一个糟糕的类比。十进制表示形式有实际用途,因为我们只是学会了处理它。会更快地计算哪一个?7 * 6还是07 * 06?我们使用十进制表示数字,因为我们可以更好地处理它们,而十六进制表示的数字与机器存储它们的方式非常接近。我们经常这样做。这个站点充满了证据。
back2dos

5

回到我在CDC大型机上工作时(一个60位字,一个12位PPU字),所有核心转储等都是八进制的(每个字20个八进制数字,每个PPU字4个)。


3

与十六进制一样,八进制表示法有时也用于指定字符代码。出于与十六进制相同的原因,它可以派上用场:十六进制比二进制更紧凑,但是在您的头脑中很容易转换为二进制。


2

像十六进制一样,八进制数字很容易从二进制转换。从右边开始,将二进制数字分成三组。

10010101110  // binary

// conversion
(010)(010)(101)(110)
// so, in octal we have...
(2)(2)(5)(6)
2256

10010101110 (base 2) == 2256 (base 8)

7
这是显而易见的。问题是有关何时实际使用它
back2dos

2
@ back2dos:然后请随意发布答案,而不是多次发表相同的评论。
Ed S.

4
@EdS。您甚至都没有尝试回答问题。您说的话很明显,原始海报几乎肯定已经知道答案了。正如主持人喜欢说的那样,这不是我们的目标。有关更多信息,请参见meta.programmers.stackexchange.com/questions/1968/…
btilly 2011年

@ back2dos,btilly-Stackexhange网站上的答案不仅是针对OP的,它们还成为任何通过读者的永久资源。如果此答案有助于对其有价值的人进行一分钱投入,那么所有显而易见的事实并不一定对所有人都显而易见。
ocodo 2011年

2
@Slomojo虽然如此,但每个问题都有资格成为主题每个相关方面的Wiki。关键是,这不能回答问题。对于“如何快速从心理上转换为八进制?”这个答案在其他地方肯定是有效的。
妮可,

2

不。从未使用过它们。甚至没有设置文件权限,因为我很少这样做,所以很难阅读。

是的,从二进制转换为二进制有明显的好处。
但是,正如@Mason所指出的,十六进制要更“自然”,因为2个十六进制数字构成一个字节。可以派上用场来表示24/32位RGB / ARGB颜色,IP地址,字节掩码等。另一边的八进制实际上并不实用,因为您很少有按3位组工作的方案。

实际上,文件权限是我唯一能想到的。如果到目前为止还没有使用的区域,我怀疑会不会有使用区域。自从最近20年以来,空间变得如此便宜,以信息对齐,易用性和可扩展性为代价,如此紧密地打包信息变得非常罕见。


2

暂且不谈,但伦敦地铁上有公共用途。每列火车既有物理标识,又有单独的标识,可在使用时显示在时间表中-参见此处:https : //upload.wikimedia.org/wikipedia/commons/4/49/LUL-S-Stock-at -Watford.jpg(注意目标显示顶部的402)。尽管显示器的电子设备基于标准的十进制标准,但您永远都看不到数字8或9,因为它们与信号系统中基于传统八进制的硬件相关联。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.