在C中分配128位整数

当我尝试在gcc 4.9.1中分配一个128位整数时,我收到一个warning: integer constant is too large for its type

示例代码

 int main(void) { __uint128_t p = 47942806932686753431; return 0; } 

产量

我正在使用gcc -std=c11 -o test test.c编译,我得到:

 test.c: In function 'main': test.c:2:19: warning: integer constant is too large for its type __uint128_t p = 47942806932686753431; ^ 

我做错了什么或者这是gcc中的错误?

我做错了什么或者这是gcc中的错误?

问题出在47942806932686753431部分,不在__uint128_t p 。 根据gcc文档 ,没有办法声明128位常量:

GCC中不支持为长整数小于128位宽的目标表达__int128类型的整数常量。

所以,看起来虽然你可以拥有128位变量 ,但你不能拥有128位常数 ,除非你的long long是128位宽。

解决方法可能是使用基本算术运算从“较窄”积分常量构造128位值,并希望编译器执行常量折叠 。

你试过这个吗?

 __int128 p = *(__int128*) "\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f"; 

编辑11月25日

很抱歉上一篇文章的说明不好。 说真的,我没有把这个答案作为一个笑话发布。 虽然GCC文档声明没有办法表达128位整数常量,但这篇文章只是为那些想要轻松地为__uint128_t变量赋值的人提供了一种解决方法

您可以尝试使用GCC(7.2.0)或Clang(5.0.0)编写下面的代码。 它打印出所需的结果。

 #include  #include  int main() { __uint128_t p = *(__int128*) "\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f"; printf("HIGH %016llx\n", (uint64_t) (p >> 64)); printf("LOW %016llx\n", (uint64_t) p); return 0; } 

标准:

 HIGH 0f0e0d0c0b0a0908 LOW 0706050403020100 

这只是一种解决方法,因为它通过将“值”放在.rodata部分(如果你objdump它)来对指针起作用,而且它不可移植(x86_64和aarch64很好但不是arm和x86)。 我认为对桌面计算机上的编码来说已经足够了。