什么是补码计算器?
补码(two's complement)是计算机用固定位数表示有符号整数的标准方式。本计算器接收一个十进制数和一个 n 位 寄存器宽度,然后展示该数值如何以补码位模式存储、这些二进制位对应的无符号值是多少,以及它们作为有符号数时该如何解读。无论输入正数还是负数都能处理。
使用方法
输入你想编码的十进制数和位数(常见为 8、16、32 位)。计算器会用取模运算把数值"装"进 n 位寄存器,显示其二进制表示,并解码出对应的有符号含义。负数会自动以补码形式存储。
公式详解
要把数值 \(x\) 存进 \(n\) 位中,存储的(无符号)位模式按下式计算
$$\text{stored} = \big(\big(x \bmod 2^{n}\big) + 2^{n}\big) \bmod 2^{n}$$某个存储值的补码(即取反)为
$$\text{twos} = \big(2^{n} - \text{stored}\big) \bmod 2^{n}$$要解读一个 \(n\) 位模式的有符号含义:如果该模式不小于 \(2^{n-1}\),其值为 \(\text{pattern} - 2^{n}\)(负数);否则其值就是模式本身。
实例演算
用 8 位编码 -5。这里 \(2^{8} = 256\),因此
$$\text{stored} = \big((-5 \bmod 256) + 256\big) \bmod 256 = 251$$换算成二进制,\(251 = 11111011\)。解码 251:由于 \(251 \ge 2^{7}\)(128),其有符号值为 \(251 - 256 = -5\)。251 的补码为 \((256 - 251) \bmod 256 = 5\),正好等于数值的绝对值。
常见问题
为什么负数看起来是一长串很大的二进制? 因为高位都是 1;在 \(n\) 位有符号运算中,最高位为 1 表示这是一个负数,所以 11111011 是 -5,而不是 251。
n 位能表示的范围是多少? 有符号值的范围是 \(-2^{n-1}\) 到 \(2^{n-1} - 1\)。以 8 位为例,就是 -128 到 127。
如果我的数太大了怎么办? 超出寄存器范围的数值会通过取模运算回绕(溢出),这和真实硬件的行为完全一致。