前言
——关于二进制补码表示法中的边界值,这是一个困惑了我许久的问题,今天偶然在 C Primer Plus 书,第十五章看到相关描述,豁然开朗。很多朋友应该都有这样的困惑,在此以纯文本的形式分享,希望对小伙伴们有所帮助。
符号量表示法
在计算机底层硬件中中,有两种方法表示有符号的整数:
符号量表示法(sing-magnitude) 和 二进制补码(two's-complement)。
符号量表示法也许是有符号数最简单的表示方式,
即用1位(如,高阶位)存储符号,
剩下7位表示数字本身(假设存储在1字节中)。
例如,1000 0001表示 -1,0000 0001 表示 1。
因此表示范围是 -127 ~ +127 。这是大家所熟知的,
这种方法的缺点是有两个 0 :+0 和 -0 。
这种容易混淆,而且用两个位组合来表示一个值也有些浪费。
二进制补码
二进制补码(two's-complement)方法避免了这个问题,
是当今最常用的系统。我们将1字节为例,讨论这种方法。
二进制补码用 1 字节中的后 7 位表示 0 ~ 127 ,高阶位设置 0 。
目前,这种方法和符号量的方法相同。
另外,如果高阶位是 1 ,表示的值为负。
这两种方法的区别在于如何确定负值。
从一个 9 位组合 1 0000 0000( 256 的二进制形式)
减去一个负数的位组合,结果是改负值的量。
例如,假设一个负值的位组合是 1000 0000,
作为一个无符号字节,该组合为表示 128;
作为一个有符号值,该组合表示负值(编码是 7 的位为 1 ),
而且值为 1 0000 0000 - 1000 0000 ,即 1000 0000( 128 )。
因此,该数是 -128 (在符号表示法中,该位组合表示 -0 )。
类似的, 1000 0001 是 -127 , 1111 1111 是 - 1 。
该方法可以表示 -128 ~ +127 范围内的数。