8 votos

Lo que determina sizeof(int)

Con respecto a los tipos de datos estándar, ¿Cuál es el tamaño de un entero en ATmega controladores? Y lo que determina el tamaño, es sólo el compilador? O es que en el diseño de hardware del controlador de sí mismo y, por tanto, todos los ATmega compiladores tienen que cumplir para que el tamaño? Y si es en el hardware, ¿cómo es que en un PC se puede tener dos diferentes compiladores de entrega de resultados diferentes para sizeof( int) tú aún se ejecutan en el mismo procesador?

12voto

Tom Carpenter Puntos 7192

int es un C tipo. El ATMega no tienen concepto de la misma, que trabajan sólo con 8 bytes bytes (debido a que tienen AVR de 8 bits Cpu).

El compilador convierte cualquier tipo de operaciones en int tipos de las operaciones equivalentes necesarios para realizar esa operación en el tamaño del nivel requerido por la arquitectura de la CPU para un AVR, se convierte para hacer operaciones en el nivel de byte, para una CPU de 16 bits, se llevaría a cabo en la 16 bits de nivel, etc.

En avr-gcc una int tipo es simplemente definida en el compilador como un 2 byte entero. El hecho de que los cambios basados en la plataforma significa que usted está mejor con el <stdint.h> como uint16_t si usted quiere estar seguro de que el tamaño de código que necesita para ser portátil. Hay tipos definidos para todos los estándares entero tamaños (8,16,32,64) en ambos firmados y sin firmar.

Existen otras definiciones para los denominados _fast tipos que están garantizados para ser de al menos el tamaño requerido, pero producirá la forma más rápida de código basado en la plataforma, por ejemplo procesadores de 32 bits tienden a realizar operaciones de 32 bits de los números más eficiente de lo que dicen los números de 8 bits, por lo que uint_fast8_t en una plataforma de 32 bits sería un entero de 32 bits (al menos 8 bits, pero es más rápido de manejar).

El sizeof() instrucción se realiza en tiempo de compilación, y se convirtió en una constante, no es ejecutado por el procesador. avr-gcc sabe lo grande que se ha definido un int as, de modo que sepa qué es lo constante para reemplazar el sizeof() call con.

6voto

Kiran Puntos 320

Los tamaños de int, short int, long int, etc se decidió por la gente que escribe en el compilador. Las reglas de C se que short int <= int <= long int, pero que deja espacio suficiente para el compilador de escritores.

Compilador de escritores analizar los procesadores de las capacidades y tratar de hacer una selección razonable para que la CPU. A menudo les dan indicadores de línea de comandos para forzar una int a ser de un tamaño determinado para hacer más fácil el puerto de código a través de procesadores.

Las diferentes secuencias de código generado por el compilador para manejar diferentes tamaños de int; la CPU es impulsado por el código, y así implementa el tamaño definido por los compiladores de salida.

El Atmega de uso del AVR de arquitectura de la CPU. En su mayoría los procesos de 8bits de datos en un tiempo dado. Por lo que el compilador genere código para implementar multi-byte de la aritmética.

El subyacente de los espacios de direcciones de la mayoría de los ATmege es de 16 bits, por lo que es muy conveniente tener la aritmética que puede tener acceso a todo eso. Por lo tanto, por defecto, int es de 16 bits. En los 'viejos tiempos' de x86 con la memoria segmentada, donde las direcciones podría ser de 16 bits o 32 bits, y el compilador orientado a generar cde para un determinado "modelo", el compilador suele código generado para un tamaño de int que podría tener el tamaño de puntero para que 'el modelo de memoria'.

Si utiliza un compilador para el mismo procesador, capaz de generar código para dos (o más) diferentes tamaños de int (int, no short int, long int, sólo int), entonces eso es exactamente lo que voy a hacer en respuesta a los correspondientes indicadores (o pragma).

El compilador 'sabe' lo que el tamaño de int es la generación de código, así que un sizeof(int) será reemplazado por el valor correcto, en tiempo de compilación, el compilador.

5voto

Al pacino Puntos 415

Los tamaños de los estándar de tipos de datos de C se determina por el compilador de la aplicación. Según la norma, un int debe ser capaz contiene los valores en el rango de -32767 a 32767 (16 bits), pero puede ser mayor. El tamaño de un int es típicamente la más valor natural para la CPU -- el tamaño de palabra, o el tamaño de un registro de CPU.

La única manera de saber con seguridad es consultar a su compilador manual o escribir el código de la prueba. Es una buena idea tener una copia del manual para un incrustados compilador ya que los detalles de la alineación y de almacenamiento de datos son más propensos a la materia en la programación embebida. Compilador de extensiones (como para la interrupción de apoyo) son también más importantes.

Si usted tiene una C99-compatible con el compilador, es más fácil utilizar el uintX_t tipos definidos en conseguir el tamaño que desee.

Para referencia, estos son los tamaños mínimos para otros tipos de datos tomadas de la sección 5.2.4.2.1 del estándar C99. Tenga en cuenta que dos de complemento de la aritmética no es necesario, aunque no sé de ningún complemento o signo-magnitud de las máquinas en la parte superior de mi cabeza.

char (tamaño en bytes): sizeof(char) siempre es igual a 1. Firmado caracteres debe contener valores en el rango de -127 a 127. Caracteres sin signo debe contener valores en el rango de 0 a 255. La norma también especifica el número mínimo de bits en un char byte, que es el 8.

corto: - 32767 32767 para firmada, de 0 a 65535 para firmar. Equivalente a 16 bits.

int: Mismo como a corto.

largo: -2147483647 a 2147483647 para firmada, de 0 a 4294967295 para firmar. Equivalente a 32 bits.

largo, largo: -9223372036854775807 a 9223372036854775807 para firmada, de 0 a 18446744073709551615 para firmar. Equivalente a 64 bits.

puntero: definido por la Implementación. El estándar permite que las diferentes "representación y los requisitos de alineación" de punteros que apuntan a diferentes tipos de datos, pero nunca he visto que en la práctica.

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X