如何解决为什么2的补码符号扩展通过添加符号位的副本而起作用?
让我们以将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
填充高位。但是什么使它起作用?也许对二进制数的“属性”使之成为可能的某种解释可以帮助我更好地理解这一点。
解决方法
对于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 举报,一经查实,本站将立刻删除。