2的补码错误

2's Complement Error

2的补码的概念我大概理解了。将一个值转换为2的补码进行减法时,只需将数字的每一位取反即可得到1的补码并加1。当计算二进制2-2之类的结果时,首先将-2转换为2的补码,(我喜欢使用 4 位表示)0010 变成 1101,然后变成 1110。然后计算 0010 + 1110 并得到 0000,溢出的 1 被截断。

但是,像 2-3 这样的问题呢?所以我做了同样的操作。 2 是 0010,3 (0011) 的 2 的补码是 1101。所以 0010 + 1101 结果是 1111,没有溢出。结果是 15。15 不是负数 1。我是否遗漏了其他网站和来源忽略提及的关于 2 的补数如何工作的关键点?

在 2 的补码中 1111 是 -1(当然如果你只有 4 位)

从 1111 到它的绝对值反转:

0000

加1

0001

记住你在做有符号算术。

在有符号运算中,最高有效位位置或最左边位置的 1 表示 (-) 符号。

所以1111是负数

1111翻转为0000加1为0001

所以答案的幅度为 1,符号为 (-)。

2-3=-1

当您计算二进制补码时,结果将始终必须作为二进制补码处理。如前所述,结果在带符号的二进制补码中为 -1,在无溢出的情况下为无符号的 15。

你要注意的是,如果你用正数做减法,结果是负数,你将不会溢出。但是如果结果是肯定的,那么就会溢出。

这是合乎逻辑的:如果结果为正,则它必须比原始值。加法导致较小值的唯一方法是溢出。当结果为负时,当作为无符号处理时(MSB 将为 1 而原始值为 0),它将始终大于原始值并且没有溢出。