进制
进制(又称基数、radix、数制)是用固定数量的符号来表示数值的计数方式。基数为 N 就表示只用 N 个不同的数字、逢 N 进一:十进制用 0-9,二进制只用 0 和 1,十六进制用 0-9 和 A-F。同一个数值在不同进制下写法不同,但大小完全一样——0xFF、0b11111111 和 255 指的是同一个数。
它的原理是「按位加权」:每一位的实际值等于「该位数字 × 基数的位次幂」,从右往左位次依次升高。开发中常打交道的几种:
- 二进制(base-2):位运算、掩码、标志位的底层表示
- 八进制(base-8):Unix 文件权限如
0755 - 十六进制(base-16):颜色值
#FF8800、内存地址、字节数据;1 位十六进制正好对应 4 位二进制
常见误区:字面量前缀别混淆,0x 是十六进制、0b 是二进制、0o 是八进制;在 C、旧版 JavaScript 里以 0 开头的整数会被当作八进制,很容易踩坑。要记住进制只改变书写与显示形式,不改变数值本身,也和数据类型、存储位宽无关。
常见问题
十六进制为什么在编程里这么常用?
因为 1 位十六进制正好等于 4 位二进制,能把冗长的二进制紧凑地写出来,而且和字节对齐(1 字节 = 8 位 = 2 位十六进制)。所以颜色值、内存地址、字节数据都爱用它。
0xFF 和 255 有区别吗?
没有区别,它们是同一个数值的两种写法,只是进制不同。进制只影响书写和显示,不影响值的大小,也不影响运算结果。
为什么我写的 018 会报错或结果不对?
在 C、旧版 JavaScript 等语言里,以 0 开头的整数被解释为八进制,而 8、9 不是合法的八进制数字,所以 018 会出错。想表示十进制就去掉前导 0,想表示八进制建议用更明确的 0o 前缀。