gcc中有128位整数吗?

我想要一个128位整数,因为我想存储两个64位数字相乘的结果。在gcc 4.4及更高版本中是否存在此类问题?



江户川乱折腾
浏览 2161回答 3
3回答

慕姐8265434

128位整数类型仅在64位目标上可用,因此即使您已经检测到最新的GCC版本,也需要检查可用性。从理论上讲,gcc 可以在需要4个32位寄存器来保存一个寄存器的机器上支持TImode整数,但是我认为在任何情况下它都不支持。GCC 4.6及更高版本具有__int128/ unsigned __int128定义为内置类型。 使用#ifdef __SIZEOF_INT128__检测到它。GCC 4.1及更高版本在__int128_t和__uint128_t中定义<stdint.h>。在最新的编译器上,这大概是用定义的__int128。(#include <stdint.h>如果要使用__int128_t名称代替,则仍然需要__int128。)我在Godbolt编译器资源管理器上测试了第一个支持这3种功能的编译器版本(在x86-64上)。Godbolt仅返回到gcc4.1,ICC13和clang3.0,因此我用<= 4.1表示实际的第一个支持可能更早。&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;legacy&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;recommended(?)&nbsp; &nbsp; |&nbsp; One way of detecting support&nbsp; &nbsp; &nbsp; &nbsp; __uint128_t&nbsp; &nbsp;|&nbsp; [unsigned]&nbsp; __int128&nbsp; &nbsp;|&nbsp; #ifdef __SIZEOF_INT128__gcc&nbsp; &nbsp; &nbsp; &nbsp; <=&nbsp; 4.1&nbsp; &nbsp; |&nbsp; &nbsp; &nbsp; &nbsp;4.6&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;|&nbsp; &nbsp; &nbsp;4.6clang&nbsp; &nbsp; &nbsp; <=&nbsp; 3.0&nbsp; &nbsp; |&nbsp; &nbsp; &nbsp; &nbsp;3.1&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;|&nbsp; &nbsp; &nbsp;3.3ICC&nbsp; &nbsp; &nbsp; &nbsp; <=&nbsp; 13&nbsp; &nbsp; &nbsp;|&nbsp; &nbsp; &nbsp;<= 13&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;|&nbsp; &nbsp; &nbsp;16.&nbsp; (Godbolt doesn't have 14 or 15)如果您为ARM或x86之类的32位体系结构进行编译-m32,即使这些编译器中的任何最新版本都不支持128位整数类型。 因此,如果没有它,代码完全可以工作,则需要在使用前检测支持。我知道唯一可以检测到的直接CPP宏是__SIZEOF_INT128__,但是不幸的是,一些旧的编译器版本在不定义它的情况下就支持它。(并且没有__uint128_tgcc4.6样式的宏unsigned __int128)。 如何知道__uint128_t是否已定义某些人仍然使用RHEL(RedHat Enterprise Linux)上的gcc4.4之类的古老编译器版本,或类似的硬壳旧系统。如果您关心这样的过时gcc版本,则可能要坚持使用__uint128_t。也许sizeof(int_fast32_t)出于某种原因,在某些64位ISA上可以检测到64 位的错误。但不是在x32或ILP32 AArch64之类的ILP32 ISA上,因此也许只是检查sizeof(void*)是否__SIZEOF_INT128__未定义。gcc __int128可能没有定义一些64位ISA,甚至gcc 却定义了一些32位ISA __int128,但我不知道。正如这里对另一个答案的评论所指出的那样,GCC内部是整数TI模式。(四整数=的4x宽度int,DImode =两倍的宽度,SImode =普通的int。)正如GCC手册指出的那样,__int128支持128位整数模式(TImode)的目标支持。typedef unsigned uint128_t __attribute__ ((mode (TI)));随机事实:ICC19 -E -dM定义:#define __GLIBCXX_TYPE_INT_N_0 __int128#define __GLIBCXX_BITSIZE_INT_N_0 128测试功能为:#include <stdint.h>#define uint128_t __uint128_t//#define uint128_t unsigned __int128uint128_t mul64(uint64_t a, uint64_t b) {&nbsp; &nbsp; return (uint128_t)a * b;}所有支持它的编译器都可以高效地对其进行编译,从而&nbsp; &nbsp; mov&nbsp; &nbsp; &nbsp; &nbsp;rax, rdi&nbsp; &nbsp; mul&nbsp; &nbsp; &nbsp; &nbsp;rsi&nbsp; &nbsp; ret&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; # return in RDX:RAX

互换的青春

啊,大整数不是C的强项。GCC确实有一个unsigned __int128/&nbsp;__int128类型,从版本4.something开始(此处不确定)。我似乎确实记得,但是,__int128_t在此之前有一个定义。这些仅在64位目标上可用。(编者注:这个答案用来声称GCC定义uint128_t和int128_t我在Godbolt编译探险测试的版本中没有定义这些类型,而领先的。__从gcc4.1到8.2,或铿锵或ICC)。
打开App,查看更多内容
随时随地看视频慕课网APP