为什么 2 的补码扩展通过添加符号位的副本来工作?

Why does 2's complement sign extension work by adding copies of the sign bit?

我们以将16位有符号数符号扩展为32位寄存器为例,如mov $+/-5, %ax movswl %ax, %ebx.

有两种可能的情况:

  1. 高位为零(数字为正数)。这是非常容易理解和直观的。例如,如果我有数字 5,左补零就很容易理解。例如:

                      00000000 00000101    # 5 (represented in 16 bits)
    00000000 00000000 00000000 00000101    # 5 (represented in 32 bits)
    
    
  2. 但是,我很难理解的是当它是负数时我们进行符号扩展。示例:

                      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 位示例工作。