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.
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 typedef
cambiado 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.
Ignacio Vázquez-Abrams
Rogelio Rowland
Lorenzo Donati apoya a Ucrania
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ó.Lorenzo Donati apoya a Ucrania
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. YMMVRogelio Rowland
Lorenzo Donati apoya a Ucrania
gbulmer