Tipos integrais estendidos (escolhendo o tamanho inteiro correto em C/C++)

C/C++ tem definições muito vagas em seus tipos de dados inteiros básicos (char short int long e long long). A linguagem garante que eles possam representar pelo menos algum intervalo de valores, mas qualquer plataforma específica (hardware do sistema operacional do compilador) pode ser maior que isso.
Um bom exemplo é longo. Em uma máquina pode ter 32 bits (o mínimo exigido por C). Em outro, são 64 bits. O que você faz se quiser um tipo inteiro com exatamente 32 bits? É aí que entra int32_t: é um alias para qualquer tipo de número inteiro que seu sistema específico possua, que tenha exatamente 32 bits.
Modelo: 
 

  intN_t or uintN_t   Where N is width of integer which can be 8 16 32 64 or any other type width supported by the library. 


 

CPP
   // C++ program to show use of extended integral types   #include      using     namespace     std  ;   int     main  ()   {      uint8_t     i  ;     // i with width of exact 8 bits      // Minimum value represented by unsigned 8 bit is 0      i     =     0  ;      cout     &  lt  ;  &  lt  ;     &  quot  ;  Minimum     value     of     i    t  :     &  quot  ;  &  lt  ;  &  lt  ;     (  int  )  i     &  lt  ;  &  lt  ;     endl  ;      // Maximum value represented by unsigned 8 bit is 255      i     =     255  ;      cout     &  lt  ;  &  lt  ;     &  quot  ;  Maximum     value     of     i    t  :     &  quot  ;  &  lt  ;  &  lt  ;     (  int  )  i     &  lt  ;  &  lt  ;     endl  ;      // Warning: large integer implicitly truncated to      // unsigned type. It will print any garbage value      i     =     2436  ;      cout     &  lt  ;  &  lt  ;     &  quot  ;  Beyond     range     value     of     i    t  :     &  quot  ;     &  lt  ;  &  lt  ;     (  int  )  i     &  lt  ;  &  lt  ;     endl  ;      return     0  ;   }   

Saída: 
 

 In function 'int main()': 19:7:   warning  : large integer implicitly truncated to unsigned type [-overflow] i = 2436; ^ Minimum value of i : 0 Maximum value of i : 255 Beyond range value of i : 132 


Diferentes variações  
1. Inteiro de 8 bits sem sinal de largura fixa: uint8_t  
Isso significa me dar um unsigned int de exatamente 8 bits.
2. Inteiro de 8 bits sem sinal de largura mínima: uint_least8_t  
Isso significa me dar o menor tipo de unsigned int que tenha pelo menos 8 bits. Otimizado para consumo de memória.
3. Inteiro não assinado de 8 bits com largura mínima mais rápida: uint_fast8_t  
Isso significa me dar um unsigned int de pelo menos 8 bits, o que tornará meu programa mais rápido. Ele pode escolher tipos de dados maiores devido a considerações de alinhamento. Otimizado para velocidade.
Assim, é garantido que um uint8_t tenha exatamente 8 bits de largura. Um uint_least8_t é o menor número inteiro garantido com pelo menos 8 bits de largura. Um uint_fast8_t é o número inteiro mais rápido com garantia de pelo menos 8 bits de largura. 
Portanto, os tipos de integrais estendidas nos ajudam a escrever portátil e eficiente código.