什么是补码计算器?
补码计算器可以在十进制、二进制和十六进制之间互相转换,同时直观展示计算机内部是如何表示负数的。补码(Two's Complement)是几乎所有现代处理器存储有符号整数的标准方式,因此无论你是程序员、电子专业的学生,还是从事数字逻辑相关工作的人,掌握补码都至关重要。借助这款工具,你只需以任意进制输入一个数字,选定字长(8 位、16 位或 32 位),就能立刻看到它的补码表示及对应的十进制数值。
如何使用本计算器
- 在输入框中填入数字——支持十进制、二进制或十六进制。
- 如有需要,选择输入数字所采用的进制。
- 选择字长:8 位、16 位或 32 位。
- 查看结果:二进制、十六进制以及有符号十进制数值会自动显示。
字长之所以重要,是因为它决定了可存储数值的范围。例如,一个 8 位有符号整数的取值范围是 -128 到 127,而 16 位则可表示 -32,768 到 32,767。
计算公式详解
要求出一个二进制数的补码,只需两步:
- 逐位取反(把每个 0 变成 1,每个 1 变成 0),得到的是反码(一的补码)。
- 在结果上加 1。
最高位(最左边的一位)是符号位:0 表示正数,1 表示负数。若要把一个负的十进制数转换为补码,公式为 \(2^{n} + \text{数值}\),其中 \(n\) 是字长。
$$\text{补码} = \left(\sim \text{Number}_{\,2}\right) + 1 \pmod{2^{\text{Bit Width}}}$$
实例演示
将 -5 转换为 8 位补码:
- 先写出 +5 的二进制:
0000 0101。 - 逐位取反:
1111 1010。 - 加 1:
1111 1011。
因此 -5 在计算机中存储为 1111 1011,对应的十六进制是 FB。验证一下:\(251 - 256 = -5\)(其无符号值减去 256)。
按位宽的有符号整数范围
二的补码是计算机表示有符号整数的标准方法。对于给定的位宽 \(n\),一位作为符号位,因此可表示的有符号范围是 \(-2^{n-1}\) 到 \(2^{n-1}-1\),而相同位的无符号解释覆盖 \(0\) 到 \(2^{n}-1\)。所有算术运算以 \(2^{n}\) 为模进行环绕。
| 位宽 \(n\) | 有符号最小值 \(-2^{n-1}\) | 有符号最大值 \(2^{n-1}-1\) | 无符号最大值 \(2^{n}-1\) | 模 \(2^{n}\) |
|---|---|---|---|---|
| 8 | -128 | 127 | 255 | 256 |
| 16 | -32,768 | 32,767 | 65,535 | 65,536 |
| 32 | -2,147,483,648 | 2,147,483,647 | 4,294,967,295 | 4,294,967,296 |
| 64 | -9,223,372,036,854,775,808 | 9,223,372,036,854,775,807 | 18,446,744,073,709,551,615 | 18,446,744,073,709,551,616 |
例如,十进制 5 的 8 位二的补码形式是 251(作为无符号字节读取),它表示有符号值 \(-5\)。
常见 8 位值的十进制–二进制–十六进制参考
下表将代表性的有符号十进制值映射到其 8 位二的补码二进制和十六进制形式。负数的最高有效位设置为 1。要否定一个值,反转所有 8 位并加 1。
| 有符号十进制 | 8 位二进制 | 十六进制 | 无符号值 |
|---|---|---|---|
| -128 | 1000 0000 | 0x80 | 128 |
| -64 | 1100 0000 | 0xC0 | 192 |
| -5 | 1111 1011 | 0xFB | 251 |
| -1 | 1111 1111 | 0xFF | 255 |
| 0 | 0000 0000 | 0x00 | 0 |
| 1 | 0000 0001 | 0x01 | 1 |
| 5 | 0000 0101 | 0x05 | 5 |
| 64 | 0100 0000 | 0x40 | 64 |
| 127 | 0111 1111 | 0x7F | 127 |
要独立验证二进制形式,可以将 8 位模式 11111011 转换回十进制,作为无符号字节等于 251(作为有符号值解释为 \(-5\))。
关键术语和定义
- 位宽
- 用于存储整数的二进制位数(通常为 8、16、32 或 64)。它固定了模 \(2^{n}\),因此也固定了可表示值的范围。
- 符号位
- 指示有符号数为负数 (1) 还是非负数 (0) 的单一位。在二的补码中,它是最高阶位。
- 最高有效位 (MSB)
- 二进制数中最左边、最高值的位。在有符号二的补码值中,MSB 同时充当符号位。
- 一的补码
- 数的按位反演——每个 0 变为 1,每个 1 变为 0 (\(\overline{B}\))。它是形成二的补码之前的中间步骤。
- 二的补码
- 主流的有符号整数编码:通过反转所有位并加 1 来否定值,即 \(\overline{B}+1 \pmod{2^{n}}\)。它为零提供了单一表示,并让相同硬件能够对有符号和无符号数进行加法运算。
- 溢出 / 环绕
- 当结果超过位宽的可表示范围时发生的情况;该值以 \(2^{n}\) 为模进行环绕。例如,将 8 位最大值 127 加 1 会环绕到 -128。
- 有符号与无符号整数
- 有符号整数可以使用二的补码表示负数(范围 \(-2^{n-1}\) 到 \(2^{n-1}-1\));无符号整数将每个位模式视为非负数(范围 \(0\) 到 \(2^{n}-1\))。位是相同的——只有解释方式不同。
常见问题
计算机为什么要用补码?因为补码让加法和减法可以共用同一套运算电路,而且零只有唯一一种表示形式——这一点不同于原码(符号-数值)或反码。
如果数字超出了字长能容纳的范围会怎样?数值会溢出并“回绕”,产生意料之外的结果。要避免这种情况,请选择更大的字长。
如何把补码转换回普通十进制?如果符号位是 1,就再求一次补码并加上负号;如果符号位是 0,直接当作普通二进制数读取即可。