2010-12-30 12 views
17

Esto surgió de una pregunta el día de hoy sobre el tema de las bibliotecas bignum y hacks específicos GCC para el lenguaje C Específicamente, se utilizaron estas dos declaraciones:?.¿Qué GCC __attribute __ ((modo (XX)) realmente hacen

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

en sistemas de 32 bits y

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

en los sistemas de 64 bits.

que asumir en esto es una extensión del lenguaje C que no existe una manera de lograr lo que se consigue en los estándares actuales (C99).

Así que mis preguntas son simples: ¿esa suposición es correcta? ¿Y qué hacen estas declaraciones a la memoria subyacente? Creo que el resultado es que tengo 2*sizeof(uint32_t) para un dword en sistemas de 32 bits y 2*sizeof(uint64_t) para sistemas de 64 bits, ¿estoy en lo correcto?

Respuesta

21

Estos le permiten especificar explícitamente un tamaño para un tipo sin depender del compilador o la semántica de la máquina, como el tamaño de 'largo' o 'int'.

Se describen bastante bien on this page.

Cito de que la página:

QI: Un entero que es tan amplia como la unidad direccionable más pequeña , por lo general 8 bits.

HI: Un número entero, dos veces más ancho que un entero de modo QI, generalmente 16 bits.

SI: un número entero, cuatro veces más ancho que un entero de modo QI , generalmente 32 bits.

DI: Un entero , ocho veces más ancho que un entero de modo QI , generalmente 64 bits.

SF: A valor en coma flotante, tan ancho como un entero de modo SI , generalmente 32 bits.

DF: A valor en coma flotante, tan amplio como un entero de modo DI , generalmente 64 bits.

So DI es esencialmente sizeof(char) * 8.

Otra explicación, incluido el modo TI, se puede encontrar here (posiblemente mejor que el primer enlace, pero ambos se proporcionan como referencia).

Así que TI es esencialmente sizeof(char) * 16 (128 bits).

+0

Justo lo que necesitaba, 1. ¿No hay una forma "estándar" de evitar esto entonces, lo tomo? es decir, declarar decir un tipo de 128 bits? En su uso actual, podemos 'dword = word << 1' de forma segura y sencilla; Prefiero no reemplazar eso con una función, etc. si puedo evitarlo. –

+0

@Ninefingers: En GCC puedes usar '__int128' Creo: http://gcc.gnu.org/onlinedocs/gcc/_005f_005fint128.html. –

+0

@Ninefingers: GCC admite los tipos de extensión '__int128_t' y' __uint128_t' (al menos en plataformas de 64 bits, no está seguro acerca de los destinos de 32 bits) –

2

@haelix Acabo de leer esta pregunta y también traté de entender esto. Según mi lectura, puede encontrar las definiciones en [gcc/gcc/machmode.def] en el árbol de fuentes de GCC.Para 'SD' que debe ser:

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

y '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. 
Cuestiones relacionadas