【问题标题】:Is there a gcc function to add two large numbers for C?是否有一个 gcc 函数可以为 C 添加两个大数?
【发布时间】:2021-04-18 17:17:30
【问题描述】:

我正在尝试在 C 中添加两个数字。我的代码是

#define type unsigned
type add(type a, type b) {
    return a + b;
}

汇编中与上述代码对应的代码使用单个添加指令(https://godbolt.org/ & ARM GCC 8.3.1)。但是,当我将type 更改为unsigned long long 时,代码有点难以理解;但是,我相信它使用了一些ldm,然后要求硬件添加完整的向量(或数组)。同样,我的下一个问题是:是否可以添加两个数字,每个数字中的位数将在 1000 左右?设计一个功能并使其工作并不难,我在互联网上找到了很多这样做的代码。但是,我认为编译器写的代码比我们好,

  • 那么是否有任何 gcc 内置函数可以完成这项工作?
  • 事实上,gcc 是否为所有 5 种整数算术运算提供了这样的函数?

【问题讨论】:

  • 据我所知,答案是否定的。您可能只想使用像 Ruby 或 Python 这样已经支持任意大整数的语言。或使用GMP library
  • clang 有这样的功能,请参阅stackoverflow.com/questions/61411865/…,但它有问题。 (1) 你必须在编译时选择大小; (2) 除法和 mod 没有实现任意大的尺寸 (3) 它生成的代码相当幼稚(总是完全展开和内联),所以它通常比来自 gmp 或类似的手动调整的代码更糟糕。跨度>
  • “但是,我认为编译器比我们编写的代码更好”:在很多情况下是正确的,但任意精度的算术往往是一个例外,因为它依赖于机器构造(加进位等)在 C 中不存在并且编译器不习惯尝试优化。

标签: c gcc


【解决方案1】:

不,GCC 中没有编译器支持任意精度算术。您需要使用像 GMP 这样的库。如果您可以使用 C++ 而不是 C,则可以通过使用像 Boost Multiprecision 这样的库来获得更“自然”的 API(使用算术运算符等)。

GCC does support, as an extension__int128unsigned __int128 类型,可以像任何其他整数类型一样使用,但它们只提供 38 个十进制数字的容量。

编辑:另外,顺便说一句,不要使用宏(如#define type unsigned)重命名类型。相反,这应该使用typedef 关键字编写,如下所示:typedef unsigned type;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-03-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-17
    • 2013-10-03
    • 1970-01-01
    • 2011-08-08
    相关资源
    最近更新 更多