Estoy escribiendo una aplicación en c para un STM32F105, utilizando gcc.
En el pasado (con proyectos simples), siempre me he definido las variables como char
, int
, unsigned int
, y así sucesivamente.
Veo que es común el uso de los tipos definidos en stdint.h, como int8_t
, uint8_t
, uint32_t
, etc. Esto es cierto en varias API que estoy usando, y también en el BRAZO CMSIS de la biblioteca de ST.
Creo que entiendo por qué deberíamos hacerlo; para permitir que el compilador para optimizar mejor el espacio de la memoria. Espero que puede haber otras razones.
Sin embargo, debido a de c del entero de las reglas de la promoción, sigo corriendo contra de la conversión de las advertencias en cualquier momento que yo intente agregar dos valores, hacer una operación bit a bit, etc. La advertencia se lee algo como conversion to 'uint16_t' from 'int' may alter its value [-Wconversion]
. La cuestión que se discute aquí y aquí.
Esto no sucede cuando se utilizan las variables declaradas como int
o unsigned int
.
Para dar un par de ejemplos, dado esto:
uint16_t value16;
uint8_t value8;
Tendría que cambiar esto:
value16 <<= 8;
value8 += 2;
a este:
value16 = (uint16_t)(value16 << 8);
value8 = (uint8_t)(value8 + 2);
Es feo, pero puedo hacerlo si es necesario. Aquí están mis preguntas:
Hay un caso donde la conversión de unsigned a firmado y volver a unsigned hará que el resultado incorrecto?
Hay otros grandes razones para/contra el uso de la stdint.h tipos de entero?
Basándose en las respuestas que estoy recibiendo, parece que el stdint.h tipos son generalmente preferidos, aunque c convierte el uint
a int
y la espalda. Esto lleva a una pregunta más importante:
- No puedo evitar las advertencias del compilador mediante el uso de éste (por ejemplo,
value16 = (uint16_t)(value16 << 8);
). Solo estoy escondiendo el problema? Hay una mejor manera de ir sobre ella?