Sto scrivendo un'applicazione in c per un STM32F105, usando gcc.
In passato (con i progetti più semplici), ho sempre variabili definite come char
, int
, unsigned int
e così via.
Vedo che è comune utilizzare i tipi definiti in stdint.h, come int8_t
, uint8_t
, uint32_t
, ecc Questo è vero in API multipla che sto usando, e anche nella biblioteca ARM CMSIS da ST.
Credo di capire perché dovremmo farlo; per consentire al compilatore di ottimizzare meglio lo spazio di memoria. Mi aspetto che possano esserci ulteriori motivi.
Tuttavia, a causa delle regole di promozione dei numeri interi di c, continuo ad imbattermi in avvisi di conversione ogni volta che provo ad aggiungere due valori, eseguire un'operazione bit a bit, ecc. L'avviso legge qualcosa di simile conversion to 'uint16_t' from 'int' may alter its value [-Wconversion]
. Il problema è discusso qui e qui .
Non succede quando si usano variabili dichiarate come int
o unsigned int
.
Per fare un paio di esempi, dato questo:
uint16_t value16;
uint8_t value8;
Dovrei cambiare questo:
value16 <<= 8;
value8 += 2;
a questa:
value16 = (uint16_t)(value16 << 8);
value8 = (uint8_t)(value8 + 2);
È brutto, ma posso farlo se necessario. Ecco le mie domande:
Esiste un caso in cui la conversione da non firmato a firmato e viceversa a non firmato renderà il risultato errato?
Ci sono altri grandi motivi per / contro l'uso dei tipi interi stdint.h?
Sulla base delle risposte che sto ricevendo, sembra che i tipi stdint.h siano generalmente preferiti, anche se c converte uint
in int
e viceversa . Questo porta a una domanda più grande:
- Posso evitare gli avvisi del compilatore usando la tipografia (ad es
value16 = (uint16_t)(value16 << 8);
.). Sto solo nascondendo il problema? C'è un modo migliore per farlo?
value8 += 2u;
e value8 = value8 + 2u;
, ma ricevo gli stessi avvertimenti.
8u
e2u
.