许多语言(至少追溯到C
。我不熟悉旧版本)似乎有这样的约定,整数文字可以用3个基数写成,并带有以下符号:
0x
或0X
前缀为base-16(十六进制)数字0
前缀为base-8(八进制)数字我理解使用十六进制和十进制。它们在所有地方都被使用,具有不同的用例,它们使代码更具可读性(and
0x20000
与131072
比010
更清晰,并且不能混淆(带有'x'或'X'init的数字作为十进制数没有意义。)
但是,八进制文字对我来说似乎是个错误。首先,我从未见过它们,并且似乎没有想到单个用例,它会使代码在十六进制或十进制上使用它们更具可读性。此外,它们可能会与十进制数混淆(read
是编程语言域之外的完美的十进制十进制数。)
那么,八进制文字是否有用,从它们有用的某个时间开始它们是某种形式的历史遗留包袱,还是只是一个错误?
答案 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的组,所以八进制表示法使得权限更清楚。