Pergunta

Isso está relacionado a seguinte pergunta,

como declarar um 32-bit Integer em C

Várias pessoas mencionados int é sempre de 32 bits na maioria das plataformas. Estou curioso para saber se isso é verdade.

Você conhece algum plataformas modernas com int de um tamanho diferente? Ignorar plataformas de dinossauros com arquiteturas de 8 bits ou 16 bits.

NOTA: Eu já sei como declarar um inteiro de 32 bits a partir da outra pergunta. Este é mais como uma pesquisa para descobrir quais plataformas (CPU / OS / Compiler) inteiros de apoio com outros tamanhos.

Foi útil?

Solução

Como várias pessoas têm afirmado, não há garantias de que um 'int' será 32 bits, se você quiser usar variáveis ??de um tamanho específico, particularmente quando escrevendo código que envolve manipulações bits, você deve usar o 'Integer Padrão tipos mandatado pela especificação c99.

int8_t
uint8_t
int32_t
uint32_t

etc ...

são geralmente da forma [u] intN_t, onde especifica 'u' que deseja uma quantidade não assinada, e N é o número de bits

os typedefs corretos para estes devem estar disponíveis em stdint.h em qualquer plataforma que você está compilando para, usando estes permite que você escreva agradável, código portátil: -)

Outras dicas

sempre 32-bit em mais plataformas" - o que há de errado nisso trecho? : -)

A C norma não obriga os tamanhos de muitos de seus tipos integrais. É faz mandato tamanhos relativos, por exemplo, sizeof(int) >= sizeof(short) e assim por diante. Ele também exige distâncias mínimas, mas permite que múltiplos esquemas de codificação (complemento de dois, complemento para um, e sinal / magnitude).

Se você quiser uma variável de tamanho específico, você precisa usar um adequado para a plataforma que está sendo executado, tais como o uso de #ifdef de, algo como:

#ifdef LONG_IS_32BITS
    typedef long int32;
#else
    #ifdef INT_IS_32BITS
        typedef int int32;
    #else
        #error No 32-bit data type available
    #endif
#endif

Alternativamente, C99 e acima permite a largura exacta inteiro tipos intN_t e uintN_t:


  1. O nome typedef intN_t designa um tipo inteiro assinado com N largura, não padding bits, e representação de um de complemento de dois. Assim, int8_t denota um tipo inteiro assinado com uma largura de exatamente 8 bits.
  2. O nome typedef uintN_t designa um tipo inteiro não assinado com N largura. Assim, uint24_t indica um tipo inteiro sem sinal com uma largura de exactamente 24 bits de.
  3. Estes tipos são opcionais. No entanto, se uma aplicação fornece inteiro tipos com larguras de 8, 16, 32 ou 64 bits, não há bits de preenchimento, e (para os tipos assinados) que têm representação um de complemento de dois, deve definir os nomes correspondentes typedef.

Neste momento no tempo, a maioria das plataformas de desktop e servidor usar inteiros de 32 bits, e até mesmo muitas plataformas embarcadas (acho ARM ou x86 handheld) a utilização de 32 bits ints. Para chegar a um int 16-bit você tem que ter realmente muito pequeno: pensar "Berkeley mote" ou alguns dos mais pequenos chips de Atmel ATmega. Mas eles estão lá fora.

No. Pequeno sistemas embarcados usar 16 bit inteiros.

É muito depende do seu compilador. Alguns compilá-los como de 64 bits em máquinas de 64 bits, alguns compilação-los como de 32 bits. Sistemas embarcados são a sua própria pequena bola especial de cera.

A melhor coisa que você pode fazer para verificar:

printf("%d\n", sizeof(int));

Note que sizeof irá imprimir bytes. Fazer sizeof(int)*CHAR_BIT para obter pedaços.

código para imprimir o número de bits para vários tipos:

#include <limits.h>
#include <stdio.h>

int main(void) {
    printf("short is %d bits\n",     CHAR_BIT * sizeof( short )   );
    printf("int is %d bits\n",       CHAR_BIT * sizeof( int  )    );
    printf("long is %d bits\n",      CHAR_BIT * sizeof( long )    );
    printf("long long is %d bits\n", CHAR_BIT * sizeof(long long) );
    return 0;
}

Bem, a maioria dos processadores baseados em ARM pode executar código Thumb, que é um modo de 16 bits. Isso inclui os computadores portáteis Android ainda somente rumores e os smartphones sangramento de ponta.

Além disso, algumas calculadoras gráficas usam processadores de 8 bits, e eu chamaria aqueles bastante moderno também.

TI ainda estão vendendo placas OMAP com o DSPs C55x sobre eles, usado principalmente para a decodificação de vídeo. Eu acredito que o compilador fornecido para este tem um int de 16 bits. É quase dinossauro (o Nokia 770 foi lançado em 2005), embora você pode obter 32 DSPs bits.

A maioria código que você escreve, você pode seguramente assumir que nunca vai ser executado em um DSP. Mas talvez não todos.

Se você também está interessado no Min Valor Max / real em vez do número de bits, limits.h contém praticamente tudo o que você quer saber.

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