【发布时间】: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 中不存在并且编译器不习惯尝试优化。