区分无符号与正负二进制数
Differentiating Unsigned vs. Positive and Negative Binary Numbers
所以,我对汇编编程以及 "two's complement" 表示负数的概念都是新手,我有点困惑。
在我正在阅读的有关汇编主题的书中(以及我查阅过的所有在线资源)中解释说,您可以通过查看最重要的数字来判断数字是否为负数少量;如果该位为 1,则为负(有符号),否则为正(无符号)。然而,这对我来说没有意义。
为了说明我的困惑,想象一下 255 的无符号表示:11111111
这是一个正的无符号值,但它的最高有效位已设置。根据我一直在阅读的二进制补码规则,这应该使这个数字为负而不是正,但是可以使用这样的无符号值设置最高有效位(如果你不能这样做,一个无符号8 位整数只能表示数字 0-127)。那么这是如何工作的呢?我如何判断一个数字是有符号的还是无符号的,最高有效位已设置?而且,可能更重要的是,计算机如何区分?我只是错过了什么吗?
是对值执行的操作定义了它是有符号的还是无符号的,而不是值本身。
例如,如果您执行 mul
或 div
,则该值将被视为无符号且最高有效位是数字的一部分(因此允许对数字 0 到 255 执行操作),但是imul
或 idiv
将最高有效位视为符号(允许从 -128 到 127 的数字)。
条件跳转也一样
cmp al, 0x81
jb some_label_1 ; unsigned comparison
jl some_label_2 ; signed comparison
所以,我对汇编编程以及 "two's complement" 表示负数的概念都是新手,我有点困惑。
在我正在阅读的有关汇编主题的书中(以及我查阅过的所有在线资源)中解释说,您可以通过查看最重要的数字来判断数字是否为负数少量;如果该位为 1,则为负(有符号),否则为正(无符号)。然而,这对我来说没有意义。
为了说明我的困惑,想象一下 255 的无符号表示:11111111
这是一个正的无符号值,但它的最高有效位已设置。根据我一直在阅读的二进制补码规则,这应该使这个数字为负而不是正,但是可以使用这样的无符号值设置最高有效位(如果你不能这样做,一个无符号8 位整数只能表示数字 0-127)。那么这是如何工作的呢?我如何判断一个数字是有符号的还是无符号的,最高有效位已设置?而且,可能更重要的是,计算机如何区分?我只是错过了什么吗?
是对值执行的操作定义了它是有符号的还是无符号的,而不是值本身。
例如,如果您执行 mul
或 div
,则该值将被视为无符号且最高有效位是数字的一部分(因此允许对数字 0 到 255 执行操作),但是imul
或 idiv
将最高有效位视为符号(允许从 -128 到 127 的数字)。
条件跳转也一样
cmp al, 0x81
jb some_label_1 ; unsigned comparison
jl some_label_2 ; signed comparison