C 八进制文字的意义是什么

C 八进制文字的意义是什么,c,literals,C,Literals,许多语言(至少可以追溯到C。我不熟悉较旧的语言)似乎都有这样的约定:整数文本可以使用以下符号在3个基数中写入: 0x或0x前缀为基数为16(十六进制)的数字 0为基数为8(八进制)的数字加前缀 无前缀表示基数为10(十进制)的数字 我了解十六进制和十进制的用法。它们被广泛使用,具有不同的用例,使代码更具可读性(按位和0x20000的比131072清晰得多),并且不能混淆(带有“x”或“x”init的数字作为十进制数没有意义) 然而,八进制文字对我来说似乎是个错误。首先,我从未见过它们被使用过

许多语言(至少可以追溯到
C
。我不熟悉较旧的语言)似乎都有这样的约定:整数文本可以使用以下符号在3个基数中写入:

  • 0x
    0x
    前缀为基数为16(十六进制)的数字
  • 0
    为基数为8(八进制)的数字加前缀
  • 无前缀表示基数为10(十进制)的数字
我了解十六进制和十进制的用法。它们被广泛使用,具有不同的用例,使代码更具可读性(按位
0x20000
131072
清晰得多),并且不能混淆(带有“x”或“x”init的数字作为十进制数没有意义)

然而,八进制文字对我来说似乎是个错误。首先,我从未见过它们被使用过,而且似乎也没想到有哪一个用例能让代码在十六进制或十进制上使用它们更具可读性。此外,它们可能与十进制数混淆(
010
是编程语言领域之外的一个完全合法的十进制数)


那么,八进制文字有什么用处吗?它们是有用时遗留下来的某种形式的历史包袱,还是只是一个错误?

想到的一个用例是文件权限,例如:

int retval = mkdir("/tmp/example", 0755);

Unix中的文件权限以三组三位表示:

0 --> 000
1 --> 001
2 --> 010
3 --> 011
4 --> 100
5 --> 101
6 --> 110
7 --> 111
  • 用户:读、写、执行
  • 组:读、写、执行
  • 其他:读、写、执行
755代表用户:读、写、执行;组:读取、执行;其他:读,执行

巧合的是,基8位数字可以精确地用三位表示:

0 --> 000
1 --> 001
2 --> 010
3 --> 011
4 --> 100
5 --> 101
6 --> 110
7 --> 111
所以八进制是一种非常方便的文件权限表示法

如果使用基数10来指定模式,0755实际上会变成493,这不会清晰地映射到给定的模式,就像十六进制0x1ED一样


这里,以8为基数,每个数字正好是一组三位。

八进制文字最常用的用法是在类UNIX系统上指定文件权限

公共文件权限包括读取、写入和执行,这些权限可以应用于文件的用户、文件的组或其他用户

以下是目录列表的示例:

-rw-------  1 dbush      dbush      14982 Dec  2 14:23 test.txt
在本例中,用户具有读写权限,而组和“其他”没有权限

如果要使用
open
功能创建具有这些权限的文件,请执行以下操作:

int fd = open("test.txt", O_WRONLY | O_CREAT, 0600);
文件模式位指定如下:

0400 : read for owner
0200 : write for owner
0100 : execute for owner
0040 : read for group
0020 : write for group
0010 : execute for group
0004 : read for other
0002 : write for other
0001 : execute for other

由于权限位以3为一组,所以八进制表示法使权限更为明确。

现在没有任何有效的理由使用它们,只是历史的包袱
chmod
等可能会使用它们,但没有理由不选择使用十六进制数。也许他们只是想省去额外键入一个
x
。一个更普遍的答案是,它们用于微控制器领域。维基百科上写道:“当PDP-8、ICL 1900和IBM大型机等系统使用12位、24位或36位单词时,八进制在计算中得到了广泛应用。八进制是这些机器二进制的理想缩写,因为它们的单词大小可以被三整除”(
/me
笔划变灰的胡须…),大约在C诞生时,八进制比十六进制更广泛地使用。如果你读六十年代和七十年代的报纸,你会发现很多八度。仅仅因为八进制字符让年轻人感到困惑,所以删除它们是没有意义的。八进制字符很容易被检测出来并转换成它们的二进制等价物(ASCII,EBCDIC)-简单的掩码操作。十六进制并非如此。在早期计算中,这种简化是有价值的。今天,这可能看起来微不足道,但计算的成本要高得多。@molbdnilo我将投票支持你的评论作为答案。