2010-12-30 1 views
17

Cela découle d'une question plus tôt aujourd'hui sur le sujet des bibliothèques BigNum et gcc hacks spécifiques à la langue C Plus précisément, ces deux déclarations ont été utilisés:.Qu'est-ce que GCC __attribute __ ((mode (XX)) ne fait

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

sur les systèmes 32 bits et

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

sur les systèmes 64 bits.

Je suppose donné ceci est une extension du langage C qu'il existe aucun moyen de réaliser ce qu'il réalise dans les normes actuelles (C99). Donc, mes questions sont simples: cette hypothèse est-elle correcte? Et que font ces déclarations à la mémoire sous-jacente? Je pense que le résultat est que j'ai 2*sizeof(uint32_t) pour un dword dans les systèmes 32 bits et 2*sizeof(uint64_t) pour les systèmes 64 bits, ai-je raison?

Répondre

21

Ceci vous permet de spécifier explicitement une taille pour un type sans dépendre de la sémantique du compilateur ou de la machine, comme la taille de 'long' ou 'int'.

Ils sont décrits assez bien on this page.

Je cite cette page:

QI: Un nombre entier qui est aussi large que la plus petite unité adressable , généralement 8 bits de .

HI: Un nombre entier, deux fois plus grand que un nombre entier en mode QI, généralement 16 bits. SI: Nombre entier, quatre fois plus grand qu'un QI en nombre entier, généralement 32 bits. DI: An entier, huit fois plus grand qu'un QI en mode entier, habituellement 64 bits.

SF: A valeur à virgule flottante, aussi large qu'un SI mode entier, généralement 32 bits.

DF: A valeur à virgule flottante, aussi large qu'un DI mode entier, habituellement 64 bits.

Donc DI est essentiellement sizeof(char) * 8.

Une explication supplémentaire, y compris le mode TI, peut être trouvé here (peut-être mieux que le premier lien, mais les deux fournis à titre de référence).

Donc TI est essentiellement sizeof(char) * 16 (128 bits).

+0

Tout ce que je avais besoin, +1. N'y a-t-il pas un moyen "standard" de contourner cela, je suppose? c'est-à-dire déclarer un type de 128 bits? Dans son utilisation actuelle, nous pouvons 'dword = mot << 1' en toute sécurité et facilement; Je préfère ne pas remplacer cela avec une fonction, etc si je peux l'aider. –

+0

@Ninefingers: Dans GCC, vous pouvez utiliser '__int128' je crois: http://gcc.gnu.org/onlinedocs/gcc/_005f_005fint128.html. –

+0

@Ninefingers: GCC prend en charge les types d'extension '__int128_t' et' __uint128_t' (au moins sur les plates-formes 64 bits, pas sûr des cibles 32 bits) –

2

@haelix Il suffit de lire cette question et j'ai aussi essayé de comprendre cette chose. Par ma lecture: vous pouvez trouver les définitions dans le [gcc/gcc/machmode.def] dans l'arborescence des sources de GCC.Pour 'SD' il devrait être:

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

et 'DECIMAL_FLOAT_MODE dit:

 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. 
Questions connexes