Los tamaños de int
, short int
, long int
, etc. son decididos por las personas que escriben el compilador. Las reglas de C son que short int
< = int
< = long int
, pero eso deja mucho espacio para los escritores del compilador.
Los escritores de compiladores analizan las capacidades de los procesadores e intentan tomar decisiones razonables para esa CPU. A menudo, los indicadores de la línea de comando obligan a que int
tenga un tamaño específico para que sea más fácil portar el código entre los procesadores.
El compilador genera diferentes secuencias de código para manejar diferentes tamaños de int; la CPU está controlada por el código y, por lo tanto, implementa el tamaño definido por la salida de los compiladores.
Los Atmega's usan la arquitectura de CPU de AVR. En su mayoría procesa 8 bits de datos a la vez. Así que el compilador tiene que generar código para implementar aritmética de múltiples bytes.
Los espacios de direcciones subyacentes de la mayoría de los ATmege son de 16 bits, por lo que es muy conveniente tener una aritmética que pueda acceder a todo eso. Por lo tanto, por defecto, un int
es de 16 bits. En los "días antiguos" de x86 con memoria segmentada, donde las direcciones pueden ser de 16 o 32 bits, y el compilador dirigido a generar cde para un "modelo" en particular, el compilador generalmente genera un código para un tamaño de int
que mantenga el tamaño del puntero para ese 'modelo de memoria'.
Si usa un compilador para el mismo procesador, puede generar código para dos (o más) tamaños diferentes de int ( int
, no short int
, long int
, solo int
), eso es exactamente lo que hará en respuesta a las banderas apropiadas (o pragma).
El compilador 'sabe' para qué tamaño de int
está generando el código, por lo que sizeof(int)
será reemplazado por el valor correcto, en tiempo de compilación, por el compilador.