La différence réside dans leur exactitude et leur disponibilité.
Le doc ici dit:
Type entier non signé d'une largeur de exactement 8, 16, 32 et 64 bits respectivement (fourni uniquement si l'implémentation supporte directement le type):
uint8_t
uint16_t
uint32_t
uint64_t
Et
Type entier non signé le plus rapide d'une largeur d'au moins 8, 16, 32 et 64 bits respectivement
uint_fast8_t
uint_fast16_t
uint_fast32_t
uint_fast64_t
La différence est donc assez claire selon laquelle uint32_t
est un type qui a exactement 32
bits, et une implémentation doit le fournir seulement si elle a un type avec exactement 32 bits, et ensuite elle peut définir ce type comme uint32_t
. Cela signifie que uint32_t
peut être ou ne pas être disponible.
En revanche, uint_fast32_t
est un type qui a au moins 32 bits, ce qui signifie également qu'une implémentation peut définir uint32_t
comme uint_fast32_t
si elle fournit uint32_t
. Si elle ne fournit pas uint32_t
, alors uint_fast32_t
pourrait être un typedef de n'importe quel type qui a au moins 32
bits.
1 votes
Long long est peut-être pas de 8 octets, il est possible d'avoir un long long avec 1 octet (dans le cas où CHAR_BIT est d'au moins 64) ou avec 3738383 octets. aussi uint64_t peut être de 1, 2, 4 ou 8 octets, CHAR_BIT doit être de 64, 3, 16 ou 8 pour cela.