C 带减法的整数溢出
好的,我需要实现一个方法,根据x-y是否导致溢出,返回0或1C 带减法的整数溢出,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
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是什么意思,这主要是我问题的重点。