A diferença de int8_t, int_least8_t e int_fast8_t?

Qual é a diferença entre os tipos int int8_t , int_least8_t e int_fast8_t ?

A diferença é definida nas seções do padrão C99 que Carl Norum citou. Mas pode ser útil ter um exemplo.

Suponha que você tenha um compilador C para um sistema de 36 bits, com char = 9 bits, short = 18 bits, int = 36 bits e long = 72 bits. Então

  • int8_t não existe , porque não há como satisfazer a restrição de ter exatamente 8 bits de valor sem preenchimento.
  • int_least8_t é um typedef de char . NÃO de short ou int , porque o padrão requer o menor tipo com pelo menos 8 bits.
  • int_fast8_t pode ser qualquer coisa. É provável que seja um typedef int se o tamanho “nativo” for considerado “rápido”.

Da seção de especificações 7.8.1.1 Tipos inteiros de largura exata , parágrafo 1:

O nome typedef int N _t designa um tipo inteiro assinado com largura N, sem bits de preenchimento e uma representação de complemento de dois. Assim, int8_t denota um tipo inteiro assinado com uma largura de exatamente 8 bits.

E de: 7.18.1.2 Tipos inteiros de largura mínima , parágrafo 1:

O nome typedef int_least N _t designa um tipo inteiro assinado com uma largura de pelo menos N, de modo que nenhum tipo inteiro assinado com menor tamanho tenha pelo menos a largura especificada. Assim, int_least32_t denota um tipo inteiro assinado com uma largura de pelo menos 32 bits.

E finalmente a partir de 7.18.1.3 Tipos inteiros de largura mínima mais rápida , parágrafo 2:

O nome typedef int_fast N _t designa o tipo inteiro assinado mais rápido com uma largura de pelo menos N. O nome typedef uint_fast N _t designa o tipo inteiro não assinado mais rápido com uma largura de pelo menos N.

intN_t (e uintN_t ) não é necessário em todas as implementações do C99 . Esses tipos são os “tipos inteiros de largura exata”. Eles são necessários em implementações em que faz sentido tê-los (basicamente todos os computadores de mesa).

int_leastN_t é necessário em todas as implementações do C99 para valores de N de 8, 16, 32 e 64. Esses são os “tipos inteiros de largura mínima”.

int_fastN_t é necessário em todas as implementações C99 para valores de N de 8, 16, 32 e 64. Esses são os “tipos inteiros mais rápidos de largura mínima”.

Aqui está uma resposta conceitualmente simples: a largura de int * N_t para todos os três tipos deve ser> = N. intN_t tem exatamente N bits, int_leastN_t é o menos (mais estreito) desse tipo e int_fastN_t é o tipo mais rápido .

Por exemplo, em uma máquina com bytes de 8 bits e registros rápidos de 32 bits, int8_t e int_least8_t são com alias para o caractere assinado, mas int_fast8_t é aliased para int32_t. Considerando que, se a implementação escolhesse defini-los, int_least24_t e int_fast24_t seriam ambos com alias para int32_t, com int24_t deixado indefinido.

Edit: como Technophile aponta abaixo, o problema real para os tipos rápidos é a memory, não os registros (geralmente, as operações nos bits de baixa ordem dos registradores podem ser feitas tão rapidamente quanto no registrador inteiro). Por exemplo, gravar em um int8_t na memory pode exigir o carregamento da palavra de 32 bits que a contém, modificando apenas o byte e, em seguida, gravando-o novamente, enquanto que se ele fosse armazenado em uma palavra 32, poderia ser gravado sem leitura.

Eles estão relacionados ao tamanho do inteiro e são exatamente como soam.

 int8_t is exactly 8 bits int_least8_t is the smallest int type that has at least 8 bits int_fast8_t is the fastest int type that has at least 8 bits.