Unterstützt gcc 128-Bit-Int auf amd64?[doppelt]
-
29-09-2020 - |
Frage
Unterstützt gcc 128-Bit-Int auf amd64?
Wie definiere ich es?
Wie benutze ich scanf / printf zum Lesen / Schreiben?
Lösung
GCC unterstützt eingebaute __int128
und unsigned __int128
typen (nur auf 64-Bit-Plattformen), aber es sieht so aus, als ob die Formatierungsunterstützung für 128-Bit-Ganzzahlen in libc weniger verbreitet ist.
Beachten: <stdint.h>
definieren __int128_t
und __uint128_t
auf Versionen vor gcc4.6.Siehe auch Gibt es eine 128-Bit-Ganzzahl in gcc? für eine Tabelle mit gcc / Clang / ICC-Versionen.
Wie kann man wissen, ob __uint128_t definiert ist zur Erkennung von __int128
Andere Tipps
void f(__int128* res, __int128* op1, __int128* op2)
{
*res = *op1 + *op2;
}
Zum Testen speichern.c und kompilieren mit:
$ gcc -c -O3 test.c
$ objdump -d -M intel test.o
Sie erhalten:
mov rcx, rdx
mov rax, [rsi]
mov rdx, [rsi+0x8]
add rax, [rcx]
adc rdx, [rcx+0x8]
mov [rdi], rax
mov [rdi+0x8], rdx
Wie Sie sehen können, die __int128
typ wird unterstützt, indem zwei 64-Bit-Sequenzen nacheinander gehalten und dann mit dem typischen Big int-Muster bearbeitet werden, bei dem zwei Befehle verwendet werden, z. B. ADD und dann ADC (add mit carry)