I really like the “fast” C++11 types, that give best performance for a guaranteed minimum bit width. Use them when you know a variable will not exceed the maximum value of that bit width, but does not have to be a precise bit width in memory or elsewhere.

Pick specific-width fields whenever data is shared with other processes and components and you want a guarantee of its bit width.

And when using pointer size and array indices you should use types defined for those specific situations.

FAST types:

```
int_fast8_t
int_fast16_t fastest signed integer type with width of
int_fast32_t at least 8, 16, 32 and 64 bits respectively
int_fast64_t
uint_fast8_t
uint_fast16_t fastest unsigned integer type with width of
uint_fast32_t at least 8, 16, 32 and 64 bits respectively
uint_fast64_t
```

SMALL types:

```
int_least8_t
int_least16_t smallest signed integer type with width of
int_least32_t at least 8, 16, 32 and 64 bits respectively
int_least64_t
uint_least8_t
uint_least16_t smallest unsigned integer type with width of
uint_least32_t at least 8, 16, 32 and 64 bits respectively
uint_least64_t
```

EXACT types:

```
int8_t signed integer type with width of
int16_t exactly 8, 16, 32 and 64 bits respectively
int32_t with no padding bits and using 2's complement for negative values
int64_t (provided only if the implementation directly supports the type)
uint8_t unsigned integer type with width of
uint16_t exactly 8, 16, 32 and 64 bits respectively
uint32_t (provided only if the implementation directly supports the type)
uint64_t
```

SPECIFIC-USE types:

```
intptr_t integer type capable of holding a pointer
uintptr_t unsigned integer type capable of holding a pointer
size_t unsigned integer type capable of holding an array index (same size as uintptr_t)
```

Pretty much SAY BYE BYE TO [int]! 🙂 …or when going across OSes and 32/64bit platforms you will be playing with this matrix of fun (originally from here):