【问题标题】:Differentiating Unsigned vs. Positive and Negative Binary Numbers区分无符号与正负二进制数
【发布时间】:2017-02-07 01:35:45
【问题描述】:

所以,我是汇编编程的新手,以及负数的“二进制补码”表示的概念,我有点困惑。

在我正在阅读的关于汇编主题的书中(以及我查阅过的所有在线资源)中,解释说您可以通过查看数字的最高位来判断数字是否为负;如果该位为 1,则为负(有符号),否则为正(无符号)。然而,这对我来说没有意义。

为了说明我的困惑,想象一下 255 的无符号表示:11111111 这是一个正的无符号值,但它的最高有效位已设置。根据我一直在阅读的二进制补码规则,这应该使这个数字成为负数而不是正数,但是可能会有像这样的无符号值并设置最高有效位(如果你不能这样做,一个无符号的8 位整数只能表示数字 0-127)。那么这是如何工作的呢?我如何判断一个数字是有符号的还是简单地无符号的并设置了最高有效位?而且,可能更重要的是,计算机如何区分?我只是错过了什么吗?

【问题讨论】:

  • 请注意带符号的数字与无符号的数学如何更有意义,如果您有 255 个 8 位,并且您尝试将其递增(加 1),它将溢出 8 位并最终为零(256 = 1 0000 0000 => 9 位)。这很好地证明了 8 位限制为 255。但是您可以在“签名”模式下查看与 -1 + 1 = 0 相同的操作。并且以类似的方式打破有符号限制:127 + 1 = -128 (0111 1111 + 1 = 1000 0000) ->在“无符号”视图中是有意义的,因为它是 127 + 1 = 128。因此 CPU 对“有符号”和“无符号”数字执行相同的加/减操作。

标签: assembly binary twos-complement


【解决方案1】:

是对值执行的操作定义了它是有符号还是无符号,而不是值本身。 例如,如果您执行muldiv,则该值被视为无符号并且最高有效位是数字的一部分(因此允许对数字0 到255 执行操作),但imulidiv 将最高有效位视为符号(允许从 -128 到 127 的数字)。

条件跳转也是如此

cmp al, 0x81
jb some_label_1    ; unsigned comparison
jl some_label_2    ; signed comparison

【讨论】:

  • 啊,有道理。谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-07-25
  • 2019-02-23
  • 2020-06-28
  • 2017-08-19
  • 2016-03-23
  • 2013-11-18
  • 2014-01-31
相关资源
最近更新 更多