整数溢出与减法

好的,所以我需要实现一个返回零或一的方法,具体取决于xy是否导致溢出。

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

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

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

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

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

0:溢出。 xy (或-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("xx = %" PRId32 "\n", xx); printf("xy = %" PRId32 "\n\n", xy); 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 xx = 0 xy = 268435456 x2 = -2147483648 y2 = 1879048192 x2-x2 = 0 x2-y2 = -4026531840