La mayoría de los procesadores modernos almacenan enteros utilizando una representación binaria, con un byte de 8 bits. Por lo tanto, un número de 4 bytes podría almacenar 32 bits dando un rango de números:
- Números sin firmar en el rango de 0 a 4294967295 ( \ $ 2 ^ {32} \ $ )
- Números firmados en el rango -2147483648 ( \ $ - 2 ^ {31} \ $ ) a 2147483647 ( \ $ 2 ^ {31} -1 \ $ ). Estos se suelen almacenar utilizando complemento de dos .
El tamaño exacto del entero depende del tipo que use. Para los compiladores de C, estos son típicamente (unsigned) char
como 8 bits, (unsigned) short
como 16 bits, y luego (unsigned) int
es típicamente de 32 bits. También hay un (unsigned) long
que puede ser de 32 bits o de 64 bits dependiendo de la configuración del compilador y del procesador.
Para variables con un tamaño que sea consistente en todas las plataformas, puede usar los tipos en <cstdint>
: estas son (*): (u)int8_t
, (u)int16_t
y (u)int32_t
, con opcionalmente (u)int64_t
y (u)int24_t
.
Como ha dicho, desea almacenar un entero de 4 bytes (32 bits). La forma exacta en que se almacena en la memoria depende del procesador: hay dos tipos, denominados endiancia del procesador:
-
Big-Endian : almacena el byte más significativo (bits superiores) en la dirección de memoria más baja. El resto de los bytes se almacenan en orden de importancia secuencialmente reducido.
-
Little-Endian : almacena el byte menos significativo (bits más bajos) la dirección de memoria más baja. El resto de los bytes se almacenan en orden de importancia secuencialmente creciente. El STM32F40 cae en esta categoría.
Para completar, los números fraccionarios generalmente se almacenan utilizando la representación de punto flotante IEEE 754 que se utiliza, con precisión simple (~ 7 d.p.) de 32 bits, y precisión doble (~ 15 d.p.) con 64 bits.
(*) (u)
determina si está firmado o no, por ejemplo, uint8_t
no tiene signo de 8 bits, int8_t
está firmado de 8 bits.