程序员视角的计算机系统 2.2.3 二进制的补码的编码
对于许多的应用,我们期望表示负数。绝大部分的计算机的有符号的数的表示是2补码形式。
这个定义把最高位解释为负的权重值。我们表达这个解释为B2Tw:
最高位也叫做符号位。它的大小是-2^(w-1) 当符号位为1时,表示的值是负的,当符号位为0,
表示的值为非负数。
让我们考虑一下能被w位长的2补码表示的数的范围。最小值是[10....00]它的值是TMinw=-2^(w-1)
最大值是[01....11]它的值是TMaxw=2^(w-1)-1
我们能看到B2Tw是长度为w的位模式到TMinw与TMaxw的范围之间的数的一个映射。正如我们看到的
无符号的表示,每个有符号数有唯一的编码表示。在数学的术语中,我们说函数 B2Tw是一个双射。
练习问题2.17
假定w=4,我们把一个可能的十六进制的数字赋值给一个值,假定它是无符号数或者是
二补码的有符号数,根据这些解释,填写如下的空白处,使用公式2.1和2.3:
十六进制 二进制 转为无符号的4位 转为有符号的4位
____________________________________________________________
0xE [1110] 2^3+2^2+2^1=14 -2
0x0 ______ ___________ _______
0x5 ______ ___________ _______
0x8 ______ ___________ _______
0xD ______ ___________ _______
0xF ______ ___________ _______
图2.13 显示了对于不同的字大小的情况下,一些重要的数的位模式与数值的值。
前三个是可表示的整数的范围,使用符号UMaxw,Tminw,TMaxw.我们将在讨
论中经常引用这三个特殊的值。
两补码是不对称的:|TMin|=|TMax|+1.正如我们看到的,这会导致二补码算术
的一些特定的性质,并且成为一些微妙的程序错误的来源。因为0是非负数,这意味
着这种编码表示的正数比负数少一个。第二,UMax=2*TMax+1。
C标准没要求有符号数被表示为2补码的形式,但是几乎所有的机器都是这样做的。
关注最大化可移植性的程序员不应该假定可表示的数的任何的特定的范围。
Java标准 在整数数据类型的范围和表示方面是非常特别的。它要求二补码表示方法有
精确的范围。它没有Long long这个类型。