我正在阅读这篇关于表示负整数的 offset-k 方法的文章。有人可以用一些例子解释下面的段落吗:
表示有符号整数的一种逻辑方法是具有足够的二进制数范围,以便零可以偏移到正二进制数范围的中间。然后可以简单地从该零点减去负二进制数的大小。
我理解其中的机制,例如用 11 位表示数字 4,我会这样做4+1023=1027,但无法理解其背后的逻辑及其工作原理。
如果我们的数字范围是 -8 到 +8,我们可以通过将 8 添加到所有 or 数字来删除符号。那么数字将为 0 到 +16。这更像是改变比例(如将摄氏度转换为开尔文)以仅获得正值。
这种表示形式允许对有偏差的数字进行与无符号整数相同的操作,但实际上同时表示正值和负值。
该方法有几个名称:Excess-K,也称为偏移二进制或偏置表示,使用固定值 K 作为偏置值。
值由比预期值大 K 的无符号数表示。
有偏表示现在主要用于浮点数的指数。IEEE浮点标准将单精度(32位)数的指数字段定义为8位excess-127字段。
为了更清楚地理解下面两个例子:
4 位模式
0110 最高有效位的数字/列值为 8,因此 4 位模式被称为 Excess (8) 表示法。
要转换此示例,请像标准二进制数一样查找整个模式的总和值:
=(0 x 8) + (1 x 4) + (1 x 2) + (0 x 1 )
=0 + 4 + 2 + 0
=6
Run Code Online (Sandbox Code Playgroud)然后从总和中减去超出的值 8 (6 - 8)
结果是一个带符号的值,-2。
5 位模式
11110,最高有效位的数字/列值为 16,因此 5 位模式被称为 Excess (16) 表示法。
要转换此示例,请像标准二进制数一样查找整个模式的总和值:
(1x16) + (1x8) + (1x4) + (1x2) + (0x1)
= 16 + 8 + 4 + 2 + 0
= 30
Run Code Online (Sandbox Code Playgroud)然后从总和中减去当前超出值 16 (30 - 16)
结果是一个有符号值 + 14。
希望大家能够理清背后的逻辑,明白符号位0代表负号,1代表非负号来表示有符号值