2010-12-30 9 views
17

Questo nasce da una domanda prima di oggi in materia di biblioteche bignum e hack specifici GCC per il linguaggio C In particolare, sono stati utilizzati questi due dichiarazioni:?.Cosa GCC __attribute __ ((modalità (XX)) effettivamente fare

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

Nei sistemi 32 bit e

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

Nei sistemi a 64-bit.

presumo data questa è un'estensione al linguaggio C che non esiste alcun modo per realizzare ciò ne consegue negli standard attuali (C99).

Quindi le mie domande sono semplici: questa supposizione è corretta? E cosa fanno queste affermazioni alla memoria sottostante? Penso che il risultato è che ho 2*sizeof(uint32_t) per un dword in sistemi a 32 bit e 2*sizeof(uint64_t) per sistemi a 64 bit, sono corretto?

risposta

21

Questi consentono di specificare in modo esplicito una dimensione per un tipo senza dipendere dal seminario del compilatore o della macchina, come la dimensione di "lungo" o "int".

Sono descritti abbastanza bene on this page.

cito dalla pagina:

QI: Un numero intero che è larga quanto la più piccola unità indirizzabile , solitamente 8 bit.

HI: un numero intero, il doppio di una modalità ad interi QI, solitamente 16 bit.

SI: Un numero intero, quattro volte più largo di un intero in modalità QI , in genere 32 bit.

DI: Un numero intero , otto volte più largo di un intero in modalità QI , in genere 64 bit.

SF: A valore in virgola mobile, ampio come un numero intero di modalità SI , in genere 32 bit.

DF: A valore in virgola mobile, largo come un numero intero di modalità DI , in genere 64 bit.

Così DI è essenzialmente sizeof(char) * 8.

Ulteriori spiegazioni, compresa la modalità TI, possono essere trovati here (possibilmente migliore del primo collegamento, ma entrambi forniti come riferimento).

Quindi TI è essenzialmente sizeof(char) * 16 (128 bit).

+0

Proprio quello che mi serviva, +1. Non c'è un modo "standard" per aggirare questo, quindi, lo prendo? dire dichiarare un tipo a 128 bit? Nel suo attuale utilizzo, possiamo 'dword = word << 1' in modo sicuro e semplice; Preferirei non sostituirlo con una funzione, ecc. Se posso aiutarlo. –

+0

@Ninefingers: in GCC puoi usare '__int128' credo: http://gcc.gnu.org/onlinedocs/gcc/_005f_005fint128.html. –

+0

@Ninefingers: GCC supporta i tipi di estensione '' __int128_t' e __uint128_t' (almeno su piattaforme a 64 bit, non è sicuro su bersagli a 32 bit) –

2

@haelix Basta leggere questa domanda e ho anche provato a capire questa cosa. Dalla mia lettura: puoi trovare le definizioni in [gcc/gcc/machmode.def] nell'albero dei sorgenti di GCC.Per 'SD' che dovrebbe essere:

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

e 'DECIMAL_FLOAT_MODE' dice:

 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. 
Problemi correlati