C 创建一个新的 int 类型

C creating a new type of int

我知道编译器在 64 位架构上支持某些类型,例如 __int128_t。它基本上将一个数字存储在 2 个寄存器中。现在,有没有办法在 64 位机器上创建类似 __int256_t 的东西?

基本上,我想知道是否有一种方法可以扩展编译器以支持在 4 个寄存器中存储数字的数据类型,例如,并以某种方式重载 + 运算符以正确添加它们。

C 中没有。数值数据类型在编译器中实现,不能由应用程序扩展。

这在 C++ 中是可行的,尽管对象通常最终存储在堆栈中,而不是寄存器中。

您可能需要为您的编译器配置一个新目标。

如果考虑 GCC,请尝试修补主干(未来的 GCC 5.0,将于 spring 2015 年发布),因为它有更好的支持(参见其 gcc/wide-int.h 文件)对于所谓的宽整数。您可能还需要修补 gcc/config/i386/,特别是一些 *.md - 机器描述 - 文件。

注意,这是一项大量的工作(几个月)。不能用一些 bignum library like GMPlib 代替吗?

顺便说一句,您还需要定义一个新的 ABI and new calling conventions...

我认为这不值得付出努力。一项更简单的工作(仍然需要数周的努力)可能是使用 MELT 在 GCC 中自定义一些优化过程,以帮助使用 GMPlib(或您的 struct myint256_t)通过额外的内置等....

如果你只是想使用一些编译器来做这件事而不关心性能,那就破解一些更简单的编译器,比如 tinycc or nwcc

一个更简单的项目是将带有 256 位整数的 C 方言翻译成一些更普通的 C 代码(将 int256_t 翻译成一些 struct myint256_t 等...)。您还可以查看内置支持 bignums, like Common Lisp and its SBCL 实现的语言。请注意,高效的 bignum 算法在算法上非常棘手。

请注意 C++11 (and some earlier versions of C++) you can override the operator + to be able to write a + b (where both a and b are some instance of a complex class mpz_class 或您自己的)

在 C 中,您可能正在寻找类似于 GMP 库的东西,它允许您拥有任意大小的数字。

物理上将它添加到 C 编译器中是可能的,但这需要大量工作,而且大多数有兴趣的人已经在使用 GMP 或许多类似库之一。

如果您想学习,使用 Clue C Compiler which uses the Sparse parser 可能会更好,因为它是前端;它们比任何 'real' C 编译器都要好得多。