【发布时间】:2019-02-23 03:59:51
【问题描述】:
是否可以从较小的无符号整数中减去较大的无符号整数?我正在考虑的示例是 00000000-11111111,其中两个整数都是无符号的。
由于无符号整数不能为负数,这个表达式的计算结果是什么?
【问题讨论】:
标签: binary unsigned unsigned-integer
是否可以从较小的无符号整数中减去较大的无符号整数?我正在考虑的示例是 00000000-11111111,其中两个整数都是无符号的。
由于无符号整数不能为负数,这个表达式的计算结果是什么?
【问题讨论】:
标签: binary unsigned unsigned-integer
是的,至少在通用定义下。 “不能为负”并不意味着减法成为部分函数,即“有时不可能”。这意味着有一些结果,根据定义它是非负的,通过将最高位解释为具有正权重而不是负数,因此根本没有位组合被解释为一个“负值”。
这实际上只是关于位。有符号和无符号整数对位含义的解释略有不同(例如,对于 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
【讨论】: