在几次不成功的搜索之后,我仍然不知道是否有办法减去两个unsigned int
(或更多)并检测此减法的结果是否为负(
我尝试过这样的事情:
if(((int)x - (int)y) < 0)
但我不认为这是最好的方式。
答案 0 :(得分:8)
意识到你的意图
unsigned int x;
unsigned int y;
if (x - y < 0)
在数学上等同于:
unsigned int x;
unsigned int y;
if (y > x)
修改强>
我没有多少问题可以断言明确的证据,但我可以为此做出决定。它的基本不等式代数:
x - y < 0
向两边添加y:
x < y, which is the same as y > x.
如果需要,您可以使用更多变量:
x - y - z < 0 == x < y + z, or y + z > x
请参阅chux's comment to his own answer,以获取有关处理多个值时有关整数溢出的有效警告。
答案 1 :(得分:4)
简单比较。
unsigned x, y, diff;
diff = x - y;
if (x < y) {
printf("Difference is negative and not representable as an unsigned.\n");
}
[编辑] OP从“2 unsigned int”更改为“multiple unsigned int”
如果没有更宽的整数宽度可用于减去N unsigned
,则需要进行N *(N-1)/ 2比较。
N&gt; 2,最简单的,如果可用的话,使用更宽的整数。如
long long diff;
// or
#include <stdint.h>
intmax_t diff;
根据您的平台,这些类型可能会或可能不会比unsigned.
更宽,当然不会更窄。
注意:此问题同样适用于多个signed int
。其他比较虽然有用。但这是另一个问题。