微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决为什么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位示例起作用。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。