怎么用
- 输入数字,并选择它是几进制。支持常见前缀:0x 表示十六进制,0b 表示二进制,0o 表示八进制。数字中间用来分组的下划线和空格会被忽略,也可以带负号。
- 同时查看二进制、八进制、十进制和十六进制的结果。长结果会分组显示:二进制和十六进制每 4 位一组,十进制每 3 位一组;复制按钮复制的是不带分组的纯数字。
- 在最后一行可以选择 2 到 36 之间的任意进制。
- 下方表格显示这个整数按 8、16、32、64 位有符号整数存储时的样子;再输入一个十进制小数,可以看到它的单精度和双精度浮点数位模式。
进位制的原理
在 b 进制里,每一位的权重是它右边一位的 b 倍。二进制 1011 等于 1×8 + 0×4 + 1×2 + 1×1 = 11。超过十进制的进制需要更多的数字符号,所以 9 之后用字母接着数:A 是 10,F 是 15,Z 是 35。这就是为什么常规写法最多只到 36 进制,也是为什么十六进制的 FF 等于 15×16 + 15 = 255。
很多在线转换器用 JavaScript 的普通数字计算,它是 64 位浮点数,超过 2^53(9007199254740992)就会悄悄丢失精度。本工具使用任意精度整数(BigInt),所以 2^64,也就是 18446744073709551616,能精确转换成十六进制 10000000000000000;几百位长的数字也一样。
二进制补码
计算机用二进制补码存储有符号整数。对于 n 位的类型,非负数照常书写,负数 −x 存成 2^n − x。在 8 位里,−1 存为 11111111,−128 存为 10000000,可表示的范围是 −128 到 127,最高位因此起到了符号位的作用。表格给出了各种常见宽度下的位模式,放不下时会直接说明。
IEEE 754 浮点数
小数用二进制浮点数存储:一个符号位、一段指数和一段尾数(单精度分别是 8 位和 23 位,双精度是 11 位和 52 位)。很多十进制小数没有精确的二进制表示,就像 1/3 在十进制里写不尽一样。0.1 按双精度存储时的十六进制位模式是 3FB999999999999A,比 0.1 略大一点;按单精度是 3DCCCCCD,实际值是 0.10000000149011612。这就是大多数编程语言里 0.1 + 0.2 不严格等于 0.3 的原因。
示例
| 输入 | 结果 |
|---|---|
| 255(十进制) | 二进制 11111111,八进制 377,十六进制 FF |
| 0b1010_1010(二进制) | 十进制 170 |
| 0x1F(十六进制) | 十进制 31 |
| zz(36 进制) | 十进制 1295 |
| -1010(二进制) | 十进制 -10 |
| 18446744073709551616(十进制,2^64) | 十六进制 10000000000000000,精确 |
| −1 的 8 位补码 | 11111111 |
| 128 按 8 位有符号数 | 放不下(范围 −128 到 127) |
| 0.1 的 64 位浮点 | 3FB999999999999A |
| −2.5 的 64 位浮点 | C004000000000000 |
非法输入会被精确定位:十进制里的 12a 在第 3 个字符出错;二进制里的 102 也在第 3 个字符出错,因为 2 不是二进制数字。
局限
- 进制转换只处理整数。 像 0.1 这样的小数在二进制里是无限循环的;想看小数实际是怎么存储的,请用下方的浮点数部分。
- 只支持 2 到 36 进制。 Base64 是对字节的编码,不是一种计数制,请使用 Base64 工具。
- 字母不区分大小写,所以 36 进制的输入无法区分 a 和 A。
常见问题
十进制怎么转二进制?
选择十进制,输入数字,二进制结果会立刻出现,并每 4 位分一组方便阅读。
为什么 0xFF 等于 255?
F 表示 15,左边一位的权重是右边的 16 倍:15 × 16 + 15 = 255。
能处理很大的数吗?
能。转换使用任意精度整数,没有上限,也不会四舍五入。
什么是补码?
计算机存储负整数的方式:在 n 位里,−x 存成 2^n − x,所以 8 位的 −1 是 11111111。
为什么 0.1 在二进制里不精确?
因为 1/10 在二进制里是无限循环小数。浮点数部分会显示实际能存下的最接近的值。