无符号二进制整数减法

问题描述 投票:0回答:1

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

由于无符号整数不能为负数,因此该表达式将评估为什么?

binary unsigned unsigned-integer
1个回答
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

© www.soinside.com 2019 - 2024. All rights reserved.