gcc是否支持在amd64上的128位整数?
如何定义它?
如何使用scanf/printf来读写它?
gcc是否支持在amd64上的128位整数?
如何定义它?
如何使用scanf/printf来读写它?
GCC支持内置的__int128
和unsigned __int128
类型(仅限于64位平台),但是libc中对于128位整数的格式化支持似乎不太普遍。
注意:<stdint.h>
在gcc4.6之前的版本中定义了__int128_t
和__uint128_t
。有关gcc / clang / ICC版本表格,请参见Is there a 128 bit integer in gcc?
如何检测定义了__uint128_t以检测__int128
__int128
和 unsigned __int128
。 - J.N.void f(__int128* res, __int128* op1, __int128* op2)
{
*res = *op1 + *op2;
}
保存为test.c并使用以下命令进行编译:
$ gcc -c -O3 test.c
$ objdump -d -M intel test.o
您将获得:
mov rcx, rdx
mov rax, [rsi]
mov rdx, [rsi+0x8]
add rax, [rcx]
adc rdx, [rcx+0x8]
mov [rdi], rax
mov [rdi+0x8], rdx
正如您所看到的,__int128
类型是通过将两个64位按顺序保持在一起,然后使用典型的大整数模式(例如ADD和ADC(带进位加))对它们进行操作来支持的。