【发布时间】:2020-12-08 15:26:26
【问题描述】:
【问题讨论】:
标签: assembly x86 twos-complement emu8086
【问题讨论】:
标签: assembly x86 twos-complement emu8086
负数由设置的最高位指示。 如果你从 0 中减去 1,那么你会得到 0xffff = -1,因为寄存器会环绕。
0xffff = -1
0xfffe = -2
...
0xfff0 = -16
但这是一个约定,您如何解释数字(或在某些操作中使用它),因为如果您将相同的值视为无符号,那么您的范围为 0...65535 | 0...0xffff。
所以基本上,因为最高位表示负值,这意味着值的范围是-32768 ... +32767的一半。
【讨论】:
最高位用作符号标志。如果设置为 0,剩下的只是一个没有最高位的正常值。如果它是 1,那么你必须取 2 的位数的幂 - 符号标志为 1(在这种情况下为 15),然后添加正常值。或者你只取 0x10000 并减去绝对值。
这样做的好处是,例如,当您只有 8 位寄存器(我是 C64 人)时,您可以将 0xFF(表示 -1)添加到例如 0x05,然后得到 0x104 .但由于没有第 9 位,所以只有 0x04。因此,CPU 对这种有符号数字具有某种“原生支持”,因为您几乎可以将它们视为普通数字。
对于您的情况,这意味着您取 0x10000,然后减去 16,得到 0xFFF0。
【讨论】: