gpt4 book ai didi

c++ - 在 C 中添加大数

转载 作者:搜寻专家 更新时间:2023-10-31 00:20:48 25 4
gpt4 key购买 nike

当涉及到大数相加时,我对 c 的行为有点困惑。这可能是初学者的问题,但希望得到任何帮助。

unsigned long total = 0;
total = 1124073472 + 2835349503;
total += 2533359615;
printf("Total: %u\n", total);

上面打印的总数不正确。第一个加法结果很好,但第三个加法将总数抛出。我认为这是因为溢出。我的问题是什么是可能的解决方案?有没有不使用第三方库的解决方案?

注意:我试过各种数据类型的合计。其中一些是 DWORD64、INT64、LONG64 等。

提前致谢。

最佳答案

这三个数字的数学总和大于 232,并且您正在使用 unsigned long,它在 Windows 上是 32 位宽(即使您编译你的程序有 64 位指针——这是 Microsoft 故意违反 C89 的行为),因此 C 和 C++ 标准指定它环绕。您得到的数字是 1124073472 + 2835349503 + 2533359615 - 232

如果您使用 64 位类型,则必须更改 printf 格式说明符以匹配。此代码将在符合 C99 的系统上给出数学上预期的答案:

#include <stdio.h>

int main(void)
{
unsigned long long total = 1124073472 + 2835349503;
total += 2533359615;
printf("Total: %llu\n", total);
return 0;
}

然而,没有任何版本的 MSVC 是 C99 兼容的。我不知道 MSVC 的适当类型声明或 printf 格式说明符。

附录:1) 加法指定在有符号类型的溢出时回绕;这是未定义的行为。当循环限制与数据相关时,这最常困扰那些使用有符号循环索引的人。 2) 如果你用可能大于 264 的数字做数学运算,即使是 long long 也救不了你。 C 和(据我所知)C++ 没有真正的“bignum”类型;你需要一个第三方库。

关于c++ - 在 C 中添加大数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5462749/

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