为什么 2 的补码扩展通过添加符号位的副本来工作?
Why does 2's complement sign extension work by adding copies of the sign bit?
我们以将16位有符号数符号扩展为32位寄存器为例,如mov $+/-5, %ax
movswl %ax, %ebx
.
有两种可能的情况:
高位为零(数字为正数)。这是非常容易理解和直观的。例如,如果我有数字 5
,左补零就很容易理解。例如:
00000000 00000101 # 5 (represented in 16 bits)
00000000 00000000 00000000 00000101 # 5 (represented in 32 bits)
但是,我很难理解的是当它是负数时我们进行符号扩展。示例:
11111111 11111011 # -5 (represented in 16 bits)
11111111 11111111 11111111 11111011 # -5 (represented in 32 bits)
是的,我知道我们只是用 1
填充高位。但是是什么让它起作用呢?也许对二进制数的 'properties' 的解释可以帮助我更好地理解这一点。
对于n-bit 2的补数:
- 高位(符号位)有place-value
-(2^n)
- next-highest位有位值
2^(n-1)
,依此类推(正常二进制位值)
当我们扩展 1 位时,原来的符号位现在是一个“常规”位并且具有 +(2^n)
而不是 -(2^n)
的位置值,因此现有位表示的值现在比原始值 2^n + 2^n = 2^(n+1)
高。 (或者如果该位为零则相同)。
新符号位的位值为-(2^(n+1))
,因此复制原始符号位正是我们需要平衡place-value中的变化。 (如果为零则保持不变)。
一位的过程当然可以通过重复任意数量的位来概括。
有关位如何表示值的更多信息,请参阅维基百科:https://en.wikipedia.org/wiki/Two%27s_complement#Converting_from_two's_complement_representation - 2 的补码文章非常好,但没有详细说明 为什么 复制符号位有效。
您也可以在纸上尝试一些小示例,例如 sign-extending 从 4 到 5 位。 -1
(all-ones) 将是一个很好的开始值,使数学变得简单。或者 0b1000
(-8) 也是不错的选择。
Google 发现 https://andybargh.com/binary-sign-extension/ 通过一个 8 位示例工作。
我们以将16位有符号数符号扩展为32位寄存器为例,如mov $+/-5, %ax
movswl %ax, %ebx
.
有两种可能的情况:
高位为零(数字为正数)。这是非常容易理解和直观的。例如,如果我有数字
5
,左补零就很容易理解。例如:00000000 00000101 # 5 (represented in 16 bits) 00000000 00000000 00000000 00000101 # 5 (represented in 32 bits)
但是,我很难理解的是当它是负数时我们进行符号扩展。示例:
11111111 11111011 # -5 (represented in 16 bits) 11111111 11111111 11111111 11111011 # -5 (represented in 32 bits)
是的,我知道我们只是用 1
填充高位。但是是什么让它起作用呢?也许对二进制数的 'properties' 的解释可以帮助我更好地理解这一点。
对于n-bit 2的补数:
- 高位(符号位)有place-value
-(2^n)
- next-highest位有位值
2^(n-1)
,依此类推(正常二进制位值)
当我们扩展 1 位时,原来的符号位现在是一个“常规”位并且具有 +(2^n)
而不是 -(2^n)
的位置值,因此现有位表示的值现在比原始值 2^n + 2^n = 2^(n+1)
高。 (或者如果该位为零则相同)。
新符号位的位值为-(2^(n+1))
,因此复制原始符号位正是我们需要平衡place-value中的变化。 (如果为零则保持不变)。
一位的过程当然可以通过重复任意数量的位来概括。
有关位如何表示值的更多信息,请参阅维基百科:https://en.wikipedia.org/wiki/Two%27s_complement#Converting_from_two's_complement_representation - 2 的补码文章非常好,但没有详细说明 为什么 复制符号位有效。
您也可以在纸上尝试一些小示例,例如 sign-extending 从 4 到 5 位。 -1
(all-ones) 将是一个很好的开始值,使数学变得简单。或者 0b1000
(-8) 也是不错的选择。
Google 发现 https://andybargh.com/binary-sign-extension/ 通过一个 8 位示例工作。