gcc 是否支持 amd64 上的 128 位 int?
如何定义它?
如何使用 scanf/printf 读/写它?
GCC支持内置__int128
和unsigned __int128
类型(仅在 64 位平台上),但看起来对 128 位整数的格式化支持在 libc 中不太常见。
注意:在 gcc4.6 之前的版本中<stdint.h>
定义__int128_t
和。__uint128_t
另请参阅gcc 中是否有 128 位整数?对于 gcc/clang/ICC 版本表。
如何知道是否定义了 __uint128_t用于检测__int128
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 位的顺序来支持该类型,然后使用使用两条指令的典型大 int 模式对它们进行操作,例如 ADD,然后是 ADC(带进位相加)