无符号二进制整数减法

时间:2018-09-19 04:25:38

标签: binary unsigned unsigned-integer

是否可以从较小的无符号整数中减去较大的无符号整数?我要考虑的示例是00000000-11111111,其中两个整数都是无符号的。

由于无符号整数不能为负,因此该表达式的计算结果是什么?

1 个答案:

答案 0 :(得分:0)

是的,至少在通用定义下。 “不能为负”并不意味着减法成为部分函数,​​即“有时是不可能的”。这意味着有一些结果,根据定义, 是非负的,方法是将最高位解释为具有正权重,而不是负值,因此根本没有任何位组合被解释为一个“负值”。

这实际上只是一点点。有符号和无符号整数对位含义的解释略有不同(例如,对于8位,最高位的权重为-128或+128,具体取决于我们将其解释为有符号还是无符号),结果为一些操作具有单独的带符号和无符号版本(显然大于和小于,以及除法和其他一些)。该异常列表中显然没有减法:减法是减法,没有“有符号减法”和“无符号减法”。

有几种无需很多其他定义即可定义减法的方法,例如:

  • x - y = ~(~x + y)
  • x - y = x + ~y + 1

(这些当然是等效的 定义,否则会出现问题)

按位补码是对位向量的原始运算,加法只是通常的位向量加法,它既不是真正的有符号的,也没有无符号的,所以两者都可以。

因此,可以使用不同的方式来查看示例00000000 - 11111111。一个要注意的是,减法的正确操作数也称为负1(即使从11111111 + 00000001 = 00000000开始,即使通过“无符号眼镜”看,也可以这样说,因此满足了负的代数定义),我们知道0 - (-1) = 1,因此答案必须为00000001。或者我们可以使用减法的定义,例如00000000 - 11111111 = ~(~00000000 + 11111111) = ~(11111111 + 11111111) = ~11111110 = 00000001