补码怎么算 负数补码怎么算
补码(Two's complement)是一种有符号数的二进制表示方法。
我们使用B2Tw来指代补码的转换过程,其中"w"代表二进制数的位数,"B2T"的含义即是从二进制到补码的转换。
为了计算补码所代表的数值,我们需要将每一位上的值与其对应的权重相乘后求和。位数的索引记为"i",从右往左递增,权重则为2的i次方。特别地,最高位的权重需取负数,即-2^(w-1)。
关于向量x = [x^(w-1),x^(w-2),...,x^0],其补码的计算如下:
下面列举几个补码的简单实例以便于理解:
补码实际上是将最高位之后的位当作无符号二进制数,并将其转换为十进制数。若最高位为1,则需从该数中减去2^(w-1)以得到一个负数;若最高位为0,则直接得到一个非负数。这种表示方式通过减去偏移值(2^(w-1))的方式,解决了原码和反码表示中0存在两种表示方式的弊端,现已成为机器存储有符号数的标准方法。
对于w位长的补码表示,其最大值TMaxw为2^(w-1) - 1,此时最高位为0,其余位均为1。而最小值TMinw为-2^(w-1),此时最高位为1,其余位均为0。
以4位补码为例,最大值TMax4对应于B2T4([0111]),其十进制值为2^3 - 1 = 7;最小值则对应于B2T4([1000]),其十进制值为-2^3 = -8。
Two's complement的英文原意是“二的补数”。它并不是描述补码的定义,而是突出一个特性:一个补码数乘以2的w次方再减去自身,即可得到它的相反数,即-x = 2^w - x。
以字长为4的补码表示0001(十进制为1)为例,其相反数可通过10000(即2^4)减去0001得到1111(十进制为-1)。
当我们学习原码、反码、补码的相关知识时,常常会看到这样的描述:正数和0的补码就是该数字本身,而负数的补码则是将其对应正数按位取反后加1。
虽然上述描述是补码特性的一个变体,但并不直观且非定义性。更准确的解释是:补码的本质是除去最高位后,其余位所代表的数值,根据最高位的值决定是否减去偏移值(2^w,其中w为位数)所得的值。
谈及补码,不妨也简要提及与之相关的原码和反码。原码(Sign Magnitude)和反码一样,都是有符号数的表示方式之一。
原码由最高位的符号位(Sign)和其他位表示的数值大小(Magnitude)组成,与我们日常使用的有符号数相似。其计算公式为:正数的符号位为0,负数的符号位为1。
反码的计算方式与补码相似,但偏移值为2^(w-1)-1。正数的反码等于其原码,而负数的反码则是通过保留其符号位并将原码的数值位取反得到。
根据英文原意,"反码"(Ones' Complement)应译为"1们的补数"。这里的"1们"指的是多个1组成的w位数,即2^(w-1)-1这个全为1的w位二进制数。
类似补码,反码也具有一个特性:一个反码数减去偏移值(2^w-1)即可得到它的相反数。