¿Cuál es el int más efectivo en un microcontrolador de 8 bits? [cerrado]

1

El compilador define el tamaño de un int, no el procesador. Es por eso que, por ejemplo, int_8 existe. Sin embargo, se pensaba que generalmente el tipo de datos más efectivo es int. ¿Esto sigue siendo cierto cuando, por ejemplo? trabajando en un Atmega8?

Atmega8 usa 16 bits como muchos sistemas más pequeños. Pero usar un int de 8 bits me ahorraría una búsqueda y ejecución, ¿no?

    
pregunta Mr.Sh4nnon

1 respuesta

5

Los estándares de C y C ++ (usted no indicó qué uso) tienen una serie de requisitos en los rangos que pueden representar char, short, int, long y long (en variante con signo y sin signo). Pero estos requisitos dejan muchas opciones abiertas, la asignación exacta de los tipos estándar a los tipos de hardware depende del compilador (y, a veces, también de las versiones, indicadores de la línea de comando, etc.)

Al programar para sistemas embebidos pequeños, no se recomienda el uso de estos tipos "en bruto" porque la relación con el tamaño es compleja. Especifique mejor lo que necesita y deje que el compilador / biblioteca decida cómo manejar eso mejor.

Cuando necesite un tamaño específico (por ejemplo, para que coincida con el diseño de la memoria de un mensaje o un conjunto de registros de hardware, o, solo para los no firmados, necesita el módulo aritmético) use los tipos de tamaño fijos: int8_t, uint8_t, int16_t, uint16_t, int32_t, uint32_t, int64_t, uint64_t. Es posible que uno de estos tipos no exista y que obtenga un error de compilación, pero como necesita el tipo exacto que sea mejor.

Cuando necesite una variable para el cálculo, elija el tipo smalles que puede manejar su rango, pero permita que el compilador elija un tipo más grande: int_fast8_t, uint_fast8_t, etc. Esto le ofrece lo mejor de ambos mundos: en un AVR, int_fast8_t ser un byte, pero en un Cortex (donde el manejo de la aritmética de 8 bits sería más lento y usaría más instrucciones) sería de 32 bits. En su escritorio, podría ser de 64 bits, si la CPU puede manejar eso más rápido.

Cuando desee romper valores enteros y utilizar el menor espacio posible, use uno de los tipos int_leastN_t / uint_leastN_t. El compilador elegirá el tipo más pequeño que puede almacenar al menos el bist que especificó.

Y PS: use char solo para ASCII. Incluso cuando usa los tipos sin procesar (no debería, pero aún así), no use char como un entero pequeño, porque nunca se sabe si está firmado o sin firmar. Y viceversa, no utilice uno de esos tipos * _t si desea almacenar un valor ACII, para eso es el carácter.

OMI, todas las instrucciones incorporadas deben estar en desuso, a excepción de char (que no debería haber sido un int en primer lugar).

    
respondido por el Wouter van Ooijen

Lea otras preguntas en las etiquetas