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 编译器都要好得多。
我知道编译器在 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 编译器都要好得多。