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

问题描述

让我们以将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填充高位。但是什么使它起作用?也许对二进制数的“属性”使之成为可能的某种解释可以帮助我更好地理解这一点。

解决方法

对于n位2的补码:

  • 高位(符号位)具有位置值-(2^n)
  • 倒数第二位具有位置值2^(n-1),依此类推(正常的二进制位置值)

当我们扩展1位时,原始符号位现在是“常规”位,并且具有+(2^n)而不是-(2^n)的位置值,因此现有位表示的值现在是比原始值高2^n + 2^n = 2^(n+1)。 (如果该位为零,则相同)。

新符号位的位置值为-(2^(n+1)),因此复制原始符号位正是我们需要平衡位置值变化的条件。 (或者如果为零,则保持不变)。

一位的过程当然是通过重复任意数量的位来概括的。


有关这些位如何表示值的更多信息,请参见Wikipedia:https://en.wikipedia.org/wiki/Two%27s_complement#Converting_from_two's_complement_representation-2的补码文章相当不错,但是没有详细介绍为什么复制符号位的工作。 / p>

您也可以在纸上尝试一些小示例,例如将符号从4位扩展到5位。首先,-1(全1)将是一个不错的选择,使数学变得简单。或者0b1000(-8)是另一个不错的选择。

Google发现https://andybargh.com/binary-sign-extension/通过一个8位示例起作用。