Поддерживает ли gcc 128-битный int на amd64?
Поддерживает ли gcc 128-битный int на amd64?
Как определить его?
Как использовать scanf/printf для чтения/записи?
Ответы
Ответ 1
GCC поддерживает встроенные типы __int128
и __uint128
на 64-разрядных платформах, но похоже, что поддержка форматирования для 128-битных целых чисел менее распространено в libc.
Примечание: перед версией 4.6.0 они были названы __int128_t
и __uint128_t
.
Ответ 2
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 (add with carry)