gpt4 book ai didi

c - 带减法的整数溢出

转载 作者:太空宇宙 更新时间:2023-11-04 03:47:28 24 4
gpt4 key购买 nike

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

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

关于c - 带减法的整数溢出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23159020/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com