2010-12-30 7 views
17

Dieses von einer Frage zum Thema bignum Bibliotheken und gcc spezifischen Hacks der Sprache C heute früher entstanden Insbesondere diese beiden Erklärungen wurden verwendet:?.Was ist GCC __attribute __ ((Modus (XX)) tatsächlich tun

typedef unsigned int dword_t __attribute__((mode(DI))); 

auf 32-Bit-Systemen und

typedef unsigned int dword_t __attribute__((mode(TI))); 

auf 64-Bit-Systemen.

I gegeben assume ist dies eine Erweiterung der C-Sprache, dass es keine Möglichkeit gibt zu erreichen, was es erreicht in aktuellen (C99) Standards.

Also meine Fragen sind einfach: Ist diese Annahme richtig? Und was tun diese Aussagen mit dem zugrunde liegenden Speicher? Ich denke, das Ergebnis ist, habe ich 2*sizeof(uint32_t) für eine dword in 32-Bit-Systemen und 2*sizeof(uint64_t) für 64-Bit-Systeme, bin ich richtig?

Antwort

21

Hier können Sie explizit eine Größe für einen Typ angeben, ohne von Compiler- oder Maschinensemantik abhängig zu sein, z. B. die Größe von 'long' oder 'int'.

Sie sind ziemlich gut beschrieben on this page.

Ich zitiere aus dieser Seite:

QI: Eine ganze Zahl, die so breit wie die kleinste adressierbare Einheit ist, in der Regel 8 Bits.

HI: Eine ganze Zahl, doppelt so breit wie eine QI-Modus-Ganzzahl, normalerweise 16 Bit.

SI: Eine ganze Zahl, viermal so breit wie ein QI Modus Integer, normalerweise 32 Bit.

DI: An Integer, acht mal so breit wie ein QI Mode Ganzzahl, in der Regel 64 Bit.

SF: A Gleitkommawert, so breit wie ein SI Modus Integer, in der Regel 32 Bit.

DF: Ein Fließkommawert, so breit wie ein DI Modus Integer, normalerweise 64 Bit.

Also DI ist im Wesentlichen sizeof(char) * 8.

Weitere Erklärung, einschließlich TI Modus, kann here gefunden werden (möglicherweise besser als die erste Verbindung, aber beide als Referenz zur Verfügung gestellt).

Also TI ist im Wesentlichen sizeof(char) * 16 (128 Bits).

+0

Genau das, was ich brauche, +1. Gibt es keinen "normalen" Weg, um das zu umgehen, nehme ich es an? d. h. deklarieren Sie einen 128-Bit-Typ? In seiner aktuellen Verwendung können wir sicher und einfach 'word = word << 1 'schreiben; Ich würde das lieber nicht durch eine Funktion etc ersetzen, wenn ich es helfen könnte. –

+0

@Ninefingers: In GCC können Sie '__int128' Ich glaube: http://gcc.gnu.org/onlinedocs/gcc/_005f_005fint128.html. –

+0

@Ninefingers: GCC unterstützt die Erweiterungstypen '__int128_t' und' __uint128_t' (zumindest auf 64-Bit-Plattformen nicht sicher 32-Bit-Ziele) –

2

@aelix Gerade gelesen diese Frage und ich versuchte auch, dieses Ding zu verstehen. Durch meine Lektüre: Sie finden die Definitionen in [gcc/gcc/machmode.def] im GCC-Quellbaum.Für 'SD' sollte es sein:

/* Decimal floating point modes. */ 
DECIMAL_FLOAT_MODE (SD, 4, decimal_single_format); 

und 'DECIMAL_FLOAT_MODE' sagt:

 DECIMAL_FLOAT_MODE (MODE, BYTESIZE, FORMAT); 
declares MODE to be of class DECIMAL_FLOAT and BYTESIZE bytes 
wide. All of the bits of its representation are significant. 
Verwandte Themen