¿Cómo se relacionan los tamaños variables con la arquitectura de los procesadores?

A menudo me encuentro en la situación en la que no estoy seguro de cuán grande es mi variable, por ejemplo: ¿entero, corto, largo?

Sé que puedo encontrar el tamaño de la variable con sizeof(); funcion en c

Pero ahora estoy en una situación en la que estoy tratando de analizar algunos datos del archivo y tengo esa estructura de archivo, cuando me doy cuenta de que todo eso está escrito para un microcontrolador de 8 bits, no estoy seguro de cómo puedo saber cuántos datos INT representa en esa documentación? ¿Es de 8 bits - 1B? ¿Cómo depende el tamaño de las variables de la arquitectura del procesador? Si soy correcto, el tamaño máximo de la variable en un procesador de 8 bits es 1B, entonces char - int y todas las demás variables tienen un tamaño máximo de 1B.

Respuesta corta: no lo son.
Otra buena razón más para usar stdint.h .
@RogerRowland Lamentablemente stdint.h, se introdujo con C99 y muchos de los tipos que define son opcionales, es decir, una implementación también puede prescindir de ellos. Entonces, para una máxima portabilidad, especialmente si no hay un gran compilador de C disponible, está atascado con algunos trucos de preprocesamiento para definir su propio tipo int como un typedef para un tipo predefinido con el ancho de bit correcto. Además, vea la crítica en el mismo artículo al que se vinculó.
@RogerRowland En particular, consulte la sección 7.18.1.1 Tipos enteros de ancho exacto del borrador estándar C99 N1256 (par.3): These types are optional. However, if an implementation provides integer types with widths of 8, 16, 32, or 64 bits, no padding bits, and (for the signed types) that have a two’s complement representation, it shall define the corresponding typedef names.Estoy de acuerdo en que en la mayoría de las PC se cumplen estas condiciones, pero no sé acerca de todas las MCU, especialmente las condiciones sobre relleno. YMMV
@LorenzoDonati Sí, de acuerdo. No perfecto, pero mejor que nada y al menos un intento de avanzar en una mejor dirección...
@RogerRowland ¡Sí! ¡Definitivamente!
Entonces, para que quede claro: 1. ¿El archivo de datos que está tratando de analizar ya existe? 2. ¿Tiene una especificación de la estructura del archivo, definida usando tipos de datos C o C? Si alguno de estos no es cierto, por favor aclare. 3. ¿El archivo contiene binario y no texto (es decir, no parece correcto cuando mira el archivo con un editor de texto)? Si eso no es cierto, entonces tienes un problema diferente. ¿Sabe qué compilador y banderas del compilador (¿quizás en un archivo make?) se usaron para crear el archivo? Saber eso puede ser suficiente para analizar correctamente los datos de un archivo binario.

Respuestas (2)

Incluso si su procesador de 8 bits solo admite el manejo de datos a 8 bits, el compilador manejará todo lo necesario para una adición de 16 bits y la transmisión de datos, por lo que el tamaño en bits de int, short u otros se basa únicamente en su configuración de los compiladores.

Normalmente encontrará esta información en alguna parte del manual del compilador.

Para salir de este problema, es una buena práctica no usar directamente los tipos definidos por el compilador. Es posible que desee incluir stdint.h (si está disponible), que proporciona tipos de datos con nombres claros, como uint8_t, que es un número entero sin signo de 8 bits.

Si no puede usar esto, cree su propia versión y cree un encabezado con algo similar (o obtenga un stdint.h completo y adáptelo a su compilador):

typedef unsigned char uint8_t

donde, por supuesto, debe consultar el manual del compilador para obtener los tipos de compilador correctos.

Este wikibook da una buena explicación de stdint.h.

Sin embargo, existen algunos problemas, ya que, especialmente para los dispositivos integrados, no todos los compiladores admiten todos los tipos de datos. Los tipos de datos de 64 bits a menudo faltan, por lo que hay dos resultados posibles: su programa ya no se compilará (creo que ese es el buen caso) o alguien ha typedefcambiado el tipo de datos de 64 bits a uno más pequeño y su programa podría devolver resultados inesperados debido a eso.

En mi opinión, si un tipo de datos no es compatible, debería provocar un error de compilación, por lo que el programador es consciente del problema antes de introducirlo en el sistema.

Como ejemplo de dónde encontrar esa información para un compilador:

El IAR Embedded Workbench viene con un montón de documentación, para este tipo de información, debe buscar en la Guía de desarrollo, y allí, debajo de la Información de referencia, encontrará la representación de datos. Bajo ese punto encontrará todos los detalles necesarios para manejar los datos correctamente. La alineación, el tamaño y el rango se dan allí.

Data type              Size      Range             Alignment
bool                   8 bits    0 to 1            1
char                   8 bits    0 to 255          1
...
signed long long       64 bits  -2^63 to 2^63-1    8
unsigned long long     64 bits   0 to 2^64-1       8

Debe consultar la documentación del compilador de C. Debe deletrear las respuestas que necesita.

Un compilador de 8 bits puede tener "int" de 8 bits, 16 bits o algo más. En algunos casos, la cantidad de bits en un "int" predeterminado puede seleccionarse a través de un interruptor de línea de comando del compilador o una variable de entorno.

Si el compilador intentara adherirse al estándar C, no generaría ints de 8 bits. El estándar C requiere que un tipo int sea de al menos 16 bits.
El compilador AC que tiene un int de 8 bits está seriamente dañado. El estándar C89 no dice el número mínimo de bits o la representación IIRC explícitamente, pero especifica un rango que requiere al menos 16 bits.