gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 08:34:35 34 4
gpt4 key购买 nike

我们以将 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+1 位 2 的补码:

  • 高位(符号位)有位值-(2^n)
  • 下一个最高位具有位值2^(n-1),依此类推(普通二进制位值)

例如,在 8 位 2 的补码中,仅包含 MSB 集的位模式表示值 -128 = -(2^7)。设置前两位后,它表示 -128 + 64 = -64


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

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

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

(通常我们使用n=总位数,例如对于8位2的补码,n=8而不是n=7。那么MSB的位值为-2 ^(n-1),并通过使用新符号位扩展来更改其含义,如果已设置,则会添加 2^n。)


有关位如何表示值的更多信息,请参阅维基百科:https://en.wikipedia.org/wiki/Two%27s_complement#Converting_from_two's_complement_representation - 2 的补码文章相当不错,但没有详细说明为什么复制符号位有效。

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

Google 发现 https://andybargh.com/binary-sign-extension/它通过一个 8 位示例运行。

关于assembly - 为什么 2 的补码符号扩展通过添加符号位的副本来工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64301086/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com