Ich schreibe eine Anwendung in c für einen STM32F105 mit gcc.
In der Vergangenheit (mit einfacheren Projekten), habe ich immer Variablen wie definiert char
, int
, unsigned int
, und so weiter.
Ich sehe , dass es üblich ist , die Typen in stdint.h, wie definiert zu verwenden int8_t
, uint8_t
, uint32_t
usw. Dies freilich in mehreren APIs , dass ich verwende, und auch in der ARM CMSIS Bibliothek von ST.
Ich glaube, ich verstehe, warum wir das tun sollten. um es dem Compiler zu ermöglichen, den Speicherplatz besser zu optimieren. Ich gehe davon aus, dass es weitere Gründe geben kann.
Aufgrund der Regeln für die Heraufstufung von Ganzzahlen in c stoße ich jedoch immer wieder auf Konvertierungswarnungen, wenn ich versuche, zwei Werte hinzuzufügen, eine bitweise Operation durchzuführen usw. Die Warnung lautet etwa conversion to 'uint16_t' from 'int' may alter its value [-Wconversion]
. Das Thema wird hier und hier diskutiert .
Dies passiert nicht, wenn Variablen verwendet werden, die als int
oder deklariert sind unsigned int
.
Um einige Beispiele zu nennen:
uint16_t value16;
uint8_t value8;
Das müsste ich ändern:
value16 <<= 8;
value8 += 2;
dazu:
value16 = (uint16_t)(value16 << 8);
value8 = (uint8_t)(value8 + 2);
Es ist hässlich, aber ich kann es tun, wenn nötig. Hier sind meine Fragen:
Gibt es einen Fall, in dem die Konvertierung von nicht signiert zu signiert und zurück zu nicht signiert das Ergebnis falsch macht?
Gibt es andere wichtige Gründe für / gegen die Verwendung der Integer-Typen stdint.h?
Basierend auf den Antworten, die ich erhalte, sieht es so aus, als ob die stdint.h-Typen im Allgemeinen bevorzugt werden, obwohl c uint
nach int
und zurück konvertiert wird . Dies führt zu einer größeren Frage:
- Ich kann die Compiler-Warnungen durch Typecasting (zB
value16 = (uint16_t)(value16 << 8);
) verhindern. Verstecke ich nur das Problem? Gibt es einen besseren Weg, dies zu tun?
value8 += 2u;
undvalue8 = value8 + 2u;
, aber ich bekomme die gleichen Warnungen.
8u
und2u
.