Pergunta

O gcc suporta int de 128 bits no amd64?

Como defini-lo?

Como usar scanf/printf para ler/escrever?

Foi útil?

Solução

CCG suporta embutido __int128 e unsigned __int128 tipos (somente em plataformas de 64 bits), mas parece que o suporte à formatação para números inteiros de 128 bits é menos comum na libc.

Observação: <stdint.h> define __int128_t e __uint128_t em versões anteriores ao gcc4.6.Veja também Existe um número inteiro de 128 bits no gcc? para uma tabela de versões do gcc/clang/ICC.

Como saber se __uint128_t está definido para detectar __int128

Outras dicas

void f(__int128* res, __int128* op1, __int128* op2)
{
    *res = *op1 + *op2;
}

Salve em test.c e compile com:

$ gcc -c -O3 test.c
$ objdump -d -M intel test.o

Você obtém:

mov    rcx, rdx
mov    rax, [rsi]
mov    rdx, [rsi+0x8]

add    rax, [rcx]
adc    rdx, [rcx+0x8]

mov    [rdi], rax
mov    [rdi+0x8], rdx

Como você pode ver o __int128 O tipo é suportado mantendo dois 64 bits em sequência e depois operando neles com o típico padrão big int de usar duas instruções, por exemplo ADD e depois ADC (adicionar com transporte)

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top