It seems that uint32_t is much more prevalent than uint_fast32_t (I realise this is anecdotal evidence). That seems counter-intuitive to me, though.
Why do many people use
uint32_trather thanuint32_fast_t?
Note: Mis-named uint32_fast_t should be uint_fast32_t.
uint32_t has a tighter specification than uint_fast32_t and so makes for more consistent functionality.
uint32_t pros:
uint32_t cons:
uint_fast32_t pros:
uint_fast32_t cons:
uint32_fast_t. Looks like many just don't need and use this type. We didn't even use the right name!uint_fast32_t is only a 1st order approximation.In the end, what is best depends on the coding goal. Unless coding for very wide portability or some niched performance function, use uint32_t.
There is another issue when using these types that comes into play: their rank compared to int/unsigned
Presumably uint_fastN_t could be the rank of unsigned. This is not specified, but a certain and testable condition.
Thus, uintN_t is more likely than uint_fastN_t to be narrower the unsigned. This means that code that uses uintN_t math is more likely subject to integer promotions than uint_fastN_t when concerning portability.
With this concern: portability advantage uint_fastN_t with select math operations.
Side note about int32_t rather than int_fast32_t: On rare machines, INT_FAST32_MIN may be -2,147,483,647 and not -2,147,483,648. The larger point: (u)intN_t types are tightly specified and lead to portable code.