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?
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).
@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.