C 带减法的整数溢出

C 带减法的整数溢出,c,bit-manipulation,integer-overflow,C,Bit Manipulation,Integer Overflow,好的,我需要实现一个方法,根据x-y是否导致溢出,返回0或1 Example: subTract(0x80000000,0x80000000) = 1, subTract(0x80000000,0x70000000) = 0, 我不是在寻找这个方法的实现。我不知道哪一个会导致溢出,这使得启动几乎不可能。为什么其中一个会导致溢出?什么定义了减法溢出 假设系统使用2的补码和32位整数表示法,尝试使用32位和64位进行减法运算 1:没有溢出。x-x的差异是0,可以表示为32位in

好的,我需要实现一个方法,根据x-y是否导致溢出,返回0或1

Example: subTract(0x80000000,0x80000000) = 1,
         subTract(0x80000000,0x70000000) = 0, 
我不是在寻找这个方法的实现。我不知道哪一个会导致溢出,这使得启动几乎不可能。为什么其中一个会导致溢出?什么定义了减法溢出


假设系统使用2的补码和32位整数表示法,尝试使用32位和64位进行减法运算

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

0:溢出。
x-y
(或
-2147483648-1879048192
)的差异在算术上是
-4026531840
,不能表示为32位
整数。以下代码的结果提供了
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

0和1的结果不应该是相反的吗
0x8000000
减去正数将溢出(因为它是较低的可表示数字),但
0x8000000-0x8000000
(以及任何其他
x-x
)只会导致零(无溢出)。@harold I take“根据x-y是否导致溢出返回零或一”到1)返回值为0或1,2)它在某种程度上取决于减法溢出。不幸的是,对于0或1是否意味着溢出,这是不明确的。我同意你的观点,
1
应该意味着溢出,在这种情况下,它会向后看。我不知道1或0是什么意思,这主要是我问题的重点。