J'écris une application en c pour un STM32F105, en utilisant gcc.
Dans le passé (avec des projets plus simples), je l' ai toujours des variables définies comme char
, int
, unsigned int
et ainsi de suite.
Je vois qu'il est courant d'utiliser les types définis dans stdint.h, tels que int8_t
, uint8_t
, uint32_t
, etc. il vrai dans plusieurs API que j'utilise, et aussi dans la bibliothèque ARM CMSIS de ST.
Je crois que je comprends pourquoi nous devrions le faire; pour permettre au compilateur de mieux optimiser l'espace mémoire. Je pense qu'il peut y avoir des raisons supplémentaires.
Cependant, en raison des règles de promotion des entiers de c, je continue de me heurter aux avertissements de conversion chaque fois que j'essaie d'ajouter deux valeurs, d'effectuer une opération au niveau du bit, etc. L'avertissement se lit comme suit conversion to 'uint16_t' from 'int' may alter its value [-Wconversion]
. La question est discutée ici et ici .
Cela ne se produit pas lors de l'utilisation de variables déclarées comme int
ou unsigned int
.
Pour donner quelques exemples, étant donné ceci:
uint16_t value16;
uint8_t value8;
Je devrais changer cela:
value16 <<= 8;
value8 += 2;
pour ça:
value16 = (uint16_t)(value16 << 8);
value8 = (uint8_t)(value8 + 2);
C'est moche, mais je peux le faire si nécessaire. Voici mes questions:
Existe-t-il un cas où la conversion de non signé en signé et de retour en non signé rendra le résultat incorrect?
Y a-t-il d'autres grandes raisons pour / contre l'utilisation des types entiers stdint.h?
Sur la base des réponses que je reçois, il semble que les types stdint.h soient généralement préférés, même si c se convertit en uint
va- int
et-vient. Cela conduit à une plus grande question:
- Je peux empêcher les avertissements du compilateur en utilisant le transtypage (par exemple
value16 = (uint16_t)(value16 << 8);
). Suis-je juste en train de cacher le problème? Y a-t-il une meilleure façon de procéder?
value8 += 2u;
et value8 = value8 + 2u;
, mais je reçois les mêmes avertissements.
8u
et2u
.