整数溢出与减法

时间:2014-04-18 17:26:44

标签: c bit-manipulation integer-overflow

好的,所以我需要实现一个返回0或1的方法,具体取决于x-y是否会导致溢出。

Example: subTract(0x80000000,0x80000000) = 1,
         subTract(0x80000000,0x70000000) = 0, 

我不是在寻找这种方法的实现。我不明白哪一个据说会导致溢出,而​​且几乎不可能开始。为什么其中一个会导致溢出?什么定义了减法溢出。

假设系统使用2的补码和32位的整数表示

1 个答案:

答案 0 :(得分:1)

尝试使用32位和64位执行减法。

1:没有溢出。 x-x的差异为0,可以表示为32位int。无论x可能是什么整数值/类型,都可以预料到这一点。

0:溢出。 x-y(或-2147483648 - 1879048192)的差异是算术-4026531840,而可表示为32位int。以下代码的结果提供了268435456的差异。但是int溢出是未定义的行为,因此这里的结果可能在另一台机器上有所不同。

当算术上的正确差异与计算出的差异不匹配时,会发生减法溢出。

void subtest(void) {
  int32_t x = 0x80000000;
  int32_t y = 0x70000000;

  printf("x = %" PRId32 "\n", x);
  printf("y = %" PRId32 "\n", y);

  printf("x-x = %" PRId32 "\n", x-x);
  printf("x-y = %" PRId32 "\n\n", x-y);

  int64_t x2 = x;
  int64_t y2 = y;

  printf("x2 = %" PRId64 "\n", x2);
  printf("y2 = %" PRId64 "\n", y2);

  printf("x2-x2 = %" PRId64 "\n", x2-x2);
  printf("x2-y2 = %" PRId64 "\n", x2-y2);
}

x = -2147483648
y = 1879048192
x-x = 0
x-y = 268435456

x2 = -2147483648
y2 = 1879048192
x2-x2 = 0
x2-y2 = -4026531840