好的,所以我需要实现一个返回0或1的方法,具体取决于x-y是否会导致溢出。
Example: subTract(0x80000000,0x80000000) = 1,
subTract(0x80000000,0x70000000) = 0,
我不是在寻找这种方法的实现。我不明白哪一个据说会导致溢出,而且几乎不可能开始。为什么其中一个会导致溢出?什么定义了减法溢出。
假设系统使用2的补码和32位的整数表示
答案 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