测试多个unsigned int的减法

时间:2013-11-21 21:34:37

标签: c

在几次不成功的搜索之后,我仍然不知道是否有办法减去两个unsigned int(或更多)并检测此减法的结果是否为负(

)。

我尝试过这样的事情:

if(((int)x - (int)y) < 0)

但我不认为这是最好的方式。

2 个答案:

答案 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。其他比较虽然有用。但这是另一个问题。