【问题标题】:Unsigned binary integer subtraction无符号二进制整数减法
【发布时间】:2019-02-23 03:59:51
【问题描述】:

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

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

【问题讨论】:

    标签: binary unsigned unsigned-integer


    【解决方案1】:

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

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

    有几种方法可以定义减法,而不需要太多其他定义,例如:

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

    (这些当然是等价的定义,否则会有问题)

    按位补码是对位向量的基本运算,加法只是通常的位向量加法,它既不是真正的有符号也不是无符号的,两者都有。

    因此,查看示例00000000 - 11111111 有不同的方法。一个是注意减法的右操作数也称为负 1(即使通过“无符号眼镜”查看自 11111111 + 00000001 = 00000000 以来也是有道理的,因此满足否定的代数定义)并且我们知道 @ 987654325@ 所以答案必须是00000001。或者我们可以使用减法的定义,例如00000000 - 11111111 = ~(~00000000 + 11111111) = ~(11111111 + 11111111) = ~11111110 = 00000001

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-10-03
      • 2011-08-04
      • 2013-11-18
      • 1970-01-01
      • 2015-05-23
      • 1970-01-01
      • 2012-04-08
      • 1970-01-01
      相关资源
      最近更新 更多