八进制文字的重点是什么

时间:2015-12-03 13:30:16

标签: c literals

许多语言(至少追溯到C。我不熟悉旧版本)似乎有这样的约定,整数文字可以用3个基数写成,并带有以下符号:

  • 0x0X前缀为base-16(十六进制)数字
  • 0前缀为base-8(八进制)数字
  • 没有前缀表示基数为10(十进制)的数字

我理解使用十六进制和十进制。它们在所有地方都被使用,具有不同的用例,它们使代码更具可读性(and 0x20000131072010更清晰,并且不能混淆(带有'x'或'X'init的数字作为十进制数没有意义。)

但是,八进制文字对我来说似乎是个错误。首先,我从未见过它们,并且似乎没有想到单个用例,它会使代码在十六进制或十进制上使用它们更具可读性。此外,它们可能会与十进制数混淆(read是编程语言域之外的完美的十进制十进制数。)

那么,八进制文字是否有用,从它们有用的某个时间开始它们是某种形式的历史遗留包袱,还是只是一个错误?

2 个答案:

答案 0 :(得分:3)

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

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

请参阅http://linux.die.net/man/2/mkdir

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

  • 用户:读,写,执行
  • 组:读,写,执行
  • 其他:读,写,执行

755代表用户:读,写,执行; group:read,execute;其他:阅读,执行。

巧合的是,Base 8位数可以用正好三位来表示:

0 --> 000
1 --> 001
2 --> 010
3 --> 011
4 --> 100
5 --> 101
6 --> 110
7 --> 111

所以octal base是一个非常方便的文件权限表示法。

如果使用基数10指定模式,0755实际上将变为493,这不会清楚地映射到给定模式,就像在十六进制0x1ED中一样。

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

答案 1 :(得分:2)

八进制文字的最常见用法是在类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的组,所以八进制表示法使得权限更清楚。