十进制转八进制:藏在文件权限背后的那个进制
这个换算在做什么
它把一个 10 进制数写成 8 进制,只使用 0 到 7 这几个数字。八进制如今已经退守到少数几个角落,但其中一个角落非常热闹:Unix 文件权限,像 755 或 644 这样的掩码就是八进制,读法是三位彼此独立的数字,而不是一个整体数值。
一位顶三位,这就是全部理由
一位八进制恰好覆盖三位二进制,所以九位的权限字段能被整齐地切成三组:属主、属组和其他人。这就是为什么算术上早已不用八进制之后,权限记法依然保留了下来。每一组由 4 代表读、2 代表写、1 代表执行相加而成,所以 7 是三样齐全,5 是读加执行。
十进制转八进制对照表
最常见的文件模式和小组掩码背后对应的十进制值。权限那几行值得一眼认出,因为 chmod 收的是八进制,而各种报告打印出来的是十进制。
| 十进制 | 八进制 |
|---|---|
| 0 | 0 |
| 1 | 1 |
| 7 | 7 |
| 8 | 10 |
| 10 | 12 |
| 15 | 17 |
| 16 | 20 |
| 31 | 37 |
| 64 | 100 |
| 100 | 144 |
| 127 | 177 |
| 200 | 310 |
| 255 | 377 |
| 1000 | 1750 |
八进制的来历与它仅存的地盘
八进制天然适合字长是 3 的倍数的机器,PDP-8 这类早期小型机正是如此。当 8 位字节和 16 位字成为标准之后,十六进制接管了,因为 4 能整除 8,而 3 不能。文件权限是主要的幸存者,靠的是几十年的习惯,以及三位权限位恰好能被 3 整除这一点。
怎么读一位权限数字
把模式里的每一位八进制都当成一个小和:4 是读、2 是写、1 是执行,相加得到你看到的那一位。所以 755 是属主可读写执行,属组和其他人可读可执行;644 是属主可读写,其他人只读。
常见问题
怎样手算十进制转八进制?
用 8 去除,记下余数,再用商继续除,直到商为 0,然后把余数从后往前读。以 493 为例:493 ÷ 8 得 61 余 5,61 ÷ 8 得 7 余 5,7 ÷ 8 得 0 余 7,结果是 755。
为什么文件权限要用八进制写?
因为每一类用户的三位权限正好装进一位八进制,整个模式就能读成三位短数字而不是九位二进制。755 表示可读写执行、可读执行、可读执行,这个格式不需要任何算术就能解读。
chmod 755 到底给了哪些权限?
属主可以读、写和执行;同组用户和其他人只能读和执行,不能修改。换成十进制是 493。目录上这三位含义不同,执行位决定能否进入,所以目录通常都需要把它打开。
八进制还有别的用途吗?
偶尔还有。有些语言允许用前导零写八进制字面量,少数文件格式和网络掩码也会用到它。除此之外都被十六进制取代了,因为一个字节能干净地拆成两位十六进制,而 3 不能整除 8。
负值和小数也能处理吗?
都可以。负数会把符号保留在八进制数字前面,也就是符号加绝对值的形式,而不是补码。小数逐位展开,如果展开不能终止,结果会被标注为已截断,而不是不作说明地四舍五入。