我知道编译器在64位体系结构上支持某些类型,如__int128_t
。它基本上在2个寄存器中存储一个数字。现在,有没有办法在64位机器上创建像__int256_t
这样的东西?
基本上,我想知道是否有办法扩展编译器以支持在4个寄存器上存储数字的数据类型,并且以某种方式重载+运算符以正确添加它们。
答案 0 :(得分:3)
不在C中。数字数据类型在编译器中实现,不能由应用程序扩展。
这在C ++中是可行的,尽管该对象通常最终存储在堆栈中,而不是存储在寄存器中。
答案 1 :(得分:3)
您可能需要为编译器配置新目标。
如果考虑GCC,请尝试修补主干(未来的GCC 5.0,将于2015年春季发布),因为它有更好的支持(请参阅其gcc/wide-int.h
文件)以获得所谓的广告。您可能还需要修补gcc/config/i386/
,特别是某些*.md
- 机器描述文件。
要注意,这是一项大量工作(数月)。你不能只使用像bignum这样的GMPlib库吗?
顺便说一下,你还需要定义一个新的ABI和新的calling conventions ......我认为不值得努力。一个更简单的工作(仍需数周的努力)可能是使用MELT在GCC中自定义一些优化传递,以帮助使用 GMPlib (或您的struct myint256_t
)或许通过其他内置函数等....
如果您只是想使用某些编译器来执行此操作并且不关心性能,请修改一些更简单的编译器,如tinycc或nwcc
一个更简单的项目是从你的方言C到256位int到一些更普通的C代码(将int256_t
翻译成某些struct myint256_t
等)的翻译器。您还可以查看内置支持bignums的语言,例如Common Lisp及其SBCL实现。请注意,有效的bignum算法在算法上非常棘手。
请注意,在C++11(以及某些早期版本的C ++)中,您可以覆盖operator +
以便能够编写a + b
(a
和{{1}复制b
mpz_class或您自己的一个实例
答案 2 :(得分:3)
在C中,您可能正在寻找类似GMP库的内容,它允许您拥有任意大小的数字。
可以将它物理地添加到C编译器中,但这将是很多工作,并且大多数有兴趣的人已经使用GMP或许多类似的库之一。
如果您想了解,使用Clue C Compiler作为其前端的the Sparse parser可能会更好;他们比任何真实的'更好。 C编译器。