Tipos como uint32, int32, uint64, int64 são definidos em qualquer cabeçalho stdlib?

94

Costumo ver o código-fonte usando tipos como uint32, uint64 e me pergunto se eles devem ser definidos pelo programador no código do aplicativo ou se são definidos em um cabeçalho lib padrão.

Qual é a melhor maneira de ter esses tipos no código-fonte do meu aplicativo?

philix
fonte

Respostas:

135

O C99 stdint.hdefine estes:

  • int8_t
  • int16_t
  • int32_t
  • uint8_t
  • uint16_t
  • uint32_t

E, se a arquitetura os suportar:

  • int64_t
  • uint64_t

Existem vários outros typedefs inteiros stdint.htambém.

Se você não tiver um ambiente C99, provavelmente deverá fornecer seus próprios typedefs e usar os C99 de qualquer maneira.

O uint32e uint64(ou seja, sem o _tsufixo) são provavelmente específicos do aplicativo.

mu é muito curto
fonte
16
Esta resposta está errada. Todos os itens acima estão disponíveis apenas se um tipo de largura exata desse tamanho (sem preenchimento) existir na implementação. Mesmo se não, no entanto, os tipos int_leastNN_te uint_leastNN_tpara NN8, 16, 32 e 64 devem sempre existir . C99 não permite implementações sem um tipo de inteiro de pelo menos 64 bits, uma vez que long longé necessário ter pelo menos esse tamanho.
R .. GitHub PARAR DE AJUDAR O ICE
@R ..: Seria correto dizer "POSIX stdint.h" em vez de "C99 stdint.h"?
mu é muito curto
1
POSIX stdint.hrequer todos eles.
R .. GitHub PARAR DE AJUDAR O ICE
1
@R .., Você pode editar esta resposta para correção? Demorei um pouco para analisar a combinação do conteúdo atual e seus comentários.
merlin2011
SDL define alias, tal alias typedef uint32_t Uint32;em include / SDL_stdinc.h (se você for um usuário SDL)
Et7f3XIV
10

Esses tipos inteiros são todos definidos em stdint.h

GWW
fonte
Não é stdint.hespecífico da implementação? Veja também esta pergunta e esta pergunta
Chris Frederick
3
Olhando para o arquivo, encontrei "ISO C99: 7.18 tipos inteiros <stdint.h>" nos comentários. Suponho que você consiga stdint.hse respeitar o padrão C99.
philix
Não estou encontrando nenhum deles em stdint.h. Isso retorna 0 Hits: grep uint32 /usr/lib/gcc/x86_64-linux-gnu/4.9/include/stdint.h | grep -v uint32_t.
jww
1
@jww: No meu caso, esse arquivo contém #include "stdint-gcc.h", e grepping esse arquivo produz as definições.
Victor Zamanian de
1
@jww sim, eles não existem. Os únicos que são padronizados e que devem ser definidos são os que têm o _tsufixo, conforme listado na resposta acima.
Victor Zamanian de
2

Se você estiver usando o C99, apenas inclua stdint.h. BTW, os tipos de 64 bits existem se o processador os suportar.

BiGYaN
fonte
Por favor, cite algo a esse respeito.
BiGYaN
6
x86 não suporta matemática de 64 bits, mas tem tipos de 64 bits.
R .. GitHub PARAR DE AJUDAR O ICE
2
Sim. Ele suporta 32 bits x 32 bits -> multiplicação de 64 bits, 64 bits / 32 bits -> divisão de quociente de 32 bits e resto de 32 bits, além de adicionar com transportar e subtrair com instruções de empréstimo. Ele foi construído para fazer aritmética de 64 bits, apenas porque o 8086 precisava ser capaz de fazer aritmética de 32 bits.
Michael Morris,
Também há um uint128_tif __SIZEOF_INT128__definido para 16 ou superior (GCC e compatíveis). Está disponível em máquinas x86_64 / amd64, mas o processador não oferece suporte nativo. Apenas Cray tem esse tamanho de registro, IIRC.
jww
0

O questionador realmente perguntou sobre int16 (etc) ao invés de (feio) int16_t (etc).

Não há cabeçalhos padrão - nem nenhum na pasta / usr / include / do Linux que os defina sem o "_t".

Steve
fonte