Pergunta

Qual é a melhor maneira de declarar um tipo inteiro que é sempre 4 byte em qualquer plataforma? Não me preocupo com determinadas dispositivas ou máquinas antigas que têm 16 bits int.

Foi útil?

Solução

#include <stdint.h>

int32_t my_32bit_int;

Outras dicas

C não se preocupa muito com tamanhos exatos de tipos inteiros, o C99 apresenta o cabeçalho stdint.h , que provavelmente é a sua melhor aposta. Inclua isso e você pode usar por exemplo int32_t. É claro que nem todas as plataformas podem suportar isso.

A resposta de Corey está correta para o "melhor", na minha opinião, mas um simples "int" também funcionará na prática (já que você está ignorando os sistemas com INT de 16 bits). Neste ponto, tanto código depende de INT de ser de 32 bits que os fornecedores do sistema não vão alterá-lo.

(Veja também por que o Long é de 32 bits em muitos sistemas de 64 bits e por que temos "Long Long".)

Um dos benefícios de usar o INT32_T, no entanto, é que você não está perpetuando esse problema!

Você poderia caçar uma cópia do Brian Gladman's brg_types.h Se você não tiver stdint.h.

brg_types.h Descobrirá os tamanhos dos vários números inteiros da sua plataforma e criará o TypeDefs para os tamanhos comuns: 8, 16, 32 e 64 bits.

Você precisa incluir inttypes.h ao invés de stdint.h Porque stdint.h não está disponível em algumas plataformas como solaris e inttypes.h será incluído stdint.h Para você em sistemas como o Linux. Se você incluir inttypes.h Então seu código é mais portátil entre Linux e Solaris.

Este link explica o que estou dizendo:Link hp sobre inttypes.h

E este link tem uma tabela mostrando por que você não quer usar long ou int Se você tem a intenção de um certo número de bits presentes no seu tipo de dados.Link IBM sobre tipos de dados portáteis

Se o stdint.h não estiver disponível para o seu sistema, faça o seu. Eu sempre tenho um arquivo chamado "types.h" que possui typedefs para todos os valores assinados/não assinados de 8, 16 e 32 bits.

Também dependendo das plataformas de destino, você pode usar o AutoTools para o seu sistema de construção

Ele verá se o stdint.h/inttypes.h existe e se eles não criarão typedefs apropriados em um "config.h"

Stdint.h é a escolha óbvia, mas não está necessariamente disponível.

Se você estiver usando uma biblioteca portátil, é possível que ele já forneça números inteiros portáteis de largura fixa. Por exemplo, SDL tem Sint32 (S é para "assinado"), e Glib tem gint32.

C99 ou mais tarde

Usar <stdint.h>.

Se sua implementação suportar o complemento de 2 inteiros de 2 bits, ele deve definir int32_t.

Se não, então a próxima melhor coisa é int_least32_t que é um tipo inteiro suportado pela implementação de pelo menos 32 bits, independentemente da representação (complemento de dois, complemento, etc.).

Há também int_fast32_t que é um tipo inteiro com pelo menos 32 bits de largura, escolhido com a intenção de permitir as operações mais rápidas para esse requisito de tamanho.

Ansi c

Você pode usar long, que é garantido ter pelo menos 32 bits de largura como resultado dos requisitos mínimos de intervalo especificados pelo padrão.

Se você preferir usar o menor tipo inteiro para ajustar um número de 32 bits, pode usar declarações de pré-processador como as seguintes com as macros definidas em <limits.h>:

#define TARGET_MAX 2147483647L

#if   SCHAR_MAX >= TARGET_MAX
  typedef signed char int32;
#elif SHORT_MAX >= TARGET_MAX
  typedef short int32;
#elif INT_MAX   >= TARGET_MAX
  typedef int int32;
#else
  typedef long int32;
#endif

#undef TARGET_MAX
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top