Was macht GCC __attribute__((mode(XX)) eigentlich?

Lesezeit: 2 Minuten

Dies ergab sich aus einer Frage heute zum Thema Bignum-Bibliotheken und gcc-spezifische Hacks für die C-Sprache. Konkret wurden diese beiden Deklarationen verwendet:

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

Auf 32-Bit-Systemen u

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

Auf 64-Bit-Systemen.

Da dies eine Erweiterung der C-Sprache ist, gehe ich davon aus, dass es keine Möglichkeit gibt, das zu erreichen, was sie in den aktuellen (C99-) Standards erreicht.

Meine Fragen sind also einfach: Ist diese Annahme richtig? Und was machen diese Aussagen mit der zugrunde liegenden Erinnerung? Ich denke, das Ergebnis ist, dass ich habe 2*sizeof(uint32_t) Für ein dword in 32-Bit-Systemen und 2*sizeof(uint64_t) für 64-Bit-Systeme, habe ich Recht?

Benutzer-Avatar
Matthäus Iselin

Diese ermöglichen es Ihnen, eine Größe für einen Typ explizit anzugeben, ohne von der Compiler- oder Maschinensemantik abhängig zu sein, wie z. B. die Größe von „long“ oder „int“.

Sie sind ziemlich gut beschrieben auf dieser Seite.

Ich zitiere von dieser Seite:

QI: Eine Ganzzahl, die so breit ist wie die kleinste adressierbare Einheit, normalerweise 8 Bit.

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

SI: Eine Ganzzahl, viermal so breit wie eine Ganzzahl im QI-Modus, normalerweise 32 Bit.

DI: Eine Ganzzahl, achtmal so breit wie eine Ganzzahl im QI-Modus, normalerweise 64 Bit.

SF: Ein Fließkommawert, so breit wie eine Ganzzahl im SI-Modus, normalerweise 32 Bit.

DF: Ein Fließkommawert, so breit wie eine Ganzzahl im DI-Modus, normalerweise 64 Bit.

So DI Ist im Wesentlichen sizeof(char) * 8.

Weitere Erläuterungen inkl TI Modus, zu finden hier (möglicherweise besser als der erste Link, aber beide dienen als Referenz).

So TI Ist im Wesentlichen sizeof(char) * 16 (128 Bit).

  • Genau das, was ich brauchte, +1. Gibt es dann keine “Standard” -Methode, um dies zu umgehen, nehme ich an? dh einen 128-Bit-Typ deklarieren? In seiner derzeitigen Verwendung können wir dword = word << 1 sicher und einfach; Ich würde das lieber nicht durch eine Funktion usw. ersetzen, wenn ich helfen kann.

    Benutzer257111

    30. Dezember 2010 um 0:31 Uhr

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

    – Matthäus Iselin

    30. Dezember 2010 um 0:34 Uhr


  • @Ninefingers: GCC unterstützt die Erweiterungstypen __int128_t und __uint128_t (zumindest auf 64-Bit-Plattformen, bei 32-Bit-Zielen nicht sicher)

    – Stefan Kanon

    30. Dezember 2010 um 14:19 Uhr


  • wie wäre es mit __attribute__((mode(SD))) ?

    – Hälix

    24. Oktober 2014 um 7:06 Uhr

  • @haelix wie SF, aber für Doubles?

    – berkus

    26. August 2017 um 12:38 Uhr

@haelix habe gerade diese Frage gelesen und ich habe auch versucht, diese Sache zu verstehen. Nach meiner Lektüre: Sie finden die Definitionen in der [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.

1363540cookie-checkWas macht GCC __attribute__((mode(XX)) eigentlich?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy