É garantido que o char tenha exatamente 8 bits de duração?

Isso é tudo. Não encontrei nenhum tópico semelhante tão urso comigo que existe.

A partir de uma cópia da especificação ANSI C , consulte a Seção 3.1.2.5 – Tipos :

Um object declarado como tipo char é grande o suficiente para armazenar qualquer membro do conjunto de caracteres de execução básica. Se um membro do conjunto de caracteres de origem necessário enumerado em $ 2.2.1 estiver armazenado em um object char, seu valor será garantido como positivo. Se outras quantidades forem armazenadas em um object char, o comportamento será definido pela implementação: os valores são tratados como inteiros assinados ou não negativos.

O conceito de “conjunto de caracteres de execução” é apresentado na Seção 2.2.1 – Conjuntos de caracteres .

Em outras palavras, um caractere deve ser pelo menos grande o suficiente para conter uma codificação de pelo menos 95 caracteres diferentes que compõem o conjunto básico de caracteres de execução.

Agora adicione a isso a seção 2.2.4.2 – Limites numéricos

Uma implementação em conformidade deve documentar todos os limites especificados nesta seção, que devem ser especificados nos headers e .

Tamanhos de tipos integrais

Os valores indicados abaixo devem ser substituídos por expressões constantes adequadas para uso em diretivas de pré-processamento #if. Seus valores definidos pela implementação devem ser iguais ou maiores em magnitude (valor absoluto) àqueles mostrados, com o mesmo sinal.

  • número máximo de bits para o menor object que não é um campo de bits (byte)
    CHAR_BIT 8

  • valor mínimo para um object do tipo char assinado
    SCHAR_MIN -127

  • valor máximo para um object do tipo char assinado
    SCHAR_MAX +127

  • valor máximo para um object do tipo unsigned char
    UCHAR_MAX 255

….

Então você tem isso – o número de bits em um char deve ser pelo menos 8.

Não, não é garantido que seja de 8 bits. sizeof (char) é garantido como 1, mas isso não significa necessariamente um byte de 8 bits.

não, o tipo de dados char deve conter pelo menos 8 bits (consulte a especificação ANSI C)

O rascunho padrão C99 diz que um byte deve ter pelo menos 8 bits de largura, porque contém uma macro CHAR_BIT que produz o número de bits por byte e é garantida como sendo pelo menos 8 (§5.2.4.2. 1).

O rascunho padrão do C ++ inclui C’s sob o nome (§18.2.2).

Vamos ver exatamente o que o padrão diz:

5.2.4.2.1 Tamanhos de tipos inteiros

Seus valores definidos pela implementação devem ser iguais ou maiores em magnitude (valor absoluto) àqueles mostrados, com o mesmo sinal.


número de bits para o menor object que não é um campo de bits (byte)
CHAR_BIT 8

Isso nos diz que um byte tem pelo menos 8 bits (o parágrafo apenas

Se o valor de um object do tipo char for tratado como um inteiro assinado quando usado em uma expressão, o valor de CHAR_MIN será o mesmo que o de SCHAR_MIN e o valor de CHAR_MAX será igual ao de SCHAR_MAX. Caso contrário, o valor de CHAR_MIN será 0 e o valor de CHAR_MAX será igual ao de UCHAR_MAX. O valor UCHAR_MAX deve ser igual a 2 ^ CHAR_BIT – 1


Para cada um dos tipos inteiros assinados, há um tipo de inteiro não assinado correspondente (mas diferente) (designado com a palavra-chave não assinada) que usa a mesma quantidade de armazenamento (incluindo informações de sinal) e possui os mesmos requisitos de alinhamento.


Para tipos inteiros não assinados diferentes de unsigned char, os bits da representação do object devem ser divididos em dois grupos: bits de valor e bits de preenchimento (não precisa haver nenhum destes últimos).

Essas passagens nos dizem que:

  • um caractere não assinado precisa representar os valores de 2 ^ CHAR_BIT-1, que podem ser codificados em bits CHAR_BIT mínimos (de acordo com a representação de bit convencional, que é prescrita pelo padrão)
  • um caractere não assinado não contém nenhum bit adicional (preenchimento)
  • um caractere assinado leva exatamente o mesmo espaço que um caractere não assinado
  • um char é implementado da mesma forma que um caractere assinado ou não assinado

Conclusão: um char e suas variantes unsigned char e signed char são garantidamente de exatamente um byte em tamanho, e um byte tem garantia de pelo menos 8 bits de largura.

Agora são outras indicações (mas não a prova formal como acima) de que um char é de fato um byte:

Exceto para campos de bits, os objects são compostos de sequências contíguas de um ou mais bytes, o número, a ordem e a codificação dos quais são explicitamente especificados ou definidos pela implementação.


Os valores armazenados em objects de campo não-bit de qualquer outro tipo de object consistem em bits n × CHAR_BIT, onde n é o tamanho de um object desse tipo, em bytes. O valor pode ser copiado em um object do tipo unsigned char [n]


O operador sizeof produz o tamanho (em bytes) de seu operando, que pode ser uma expressão ou o nome entre parênteses de um tipo. O tamanho é determinado pelo tipo do operando. O resultado é um inteiro. Se o tipo de operando for um tipo de matriz de tamanho variável, o operando é avaliado; caso contrário, o operando não é avaliado e o resultado é uma constante inteira.


Quando aplicado a um operando que possui tipo char, unsigned char ou signed char (ou uma versão qualificada), o resultado é 1. Quando aplicado a um operando que tenha tipo de matriz, o resultado é o número total de bytes na matriz. . 88) Quando aplicado a um operando que tenha estrutura ou tipo de união, o resultado é o número total de bytes em tal object, incluindo preenchimento interno e final.

(Note que há uma ambigüidade aqui. O sizeof (char) aqui sobrescreve a regra sizeof (type) ou simplesmente dá um exemplo?)

Ainda assim, há um problema para resolver. O que exatamente é um byte? De acordo com o padrão, é “o menor object que não é um campo de bits”. Note que isto teoricamente pode não corresponder a um byte de máquina , e que também existe ambiguidade quanto ao que é referido como um “byte de máquina”: poderia qualquer construtor se referir como “byte”, sabendo que cada construtor pode ter um diferente definição de “byte”; ou uma definição geral como “uma seqüência de bits que um computador processa em unidades individuais” ou “o menor bloco endereçável de dados”.

Por exemplo, uma máquina com bytes de 7 bits teria que implementar um byte “C” como dois bytes de máquina.

Fonte de todas as citações: Versão preliminar do Comitê – 7 de setembro de 2007 ISO / IEC 9899: TC3 .

Do padrão C descrevendo limits.h (algumas reformatações são necessárias):

  1. número de bits para o menor object que não é um campo de bits (byte): CHAR_BIT 8
  2. valor mínimo para um object do tipo char assinado: SCHAR_MIN -127
  3. valor máximo para um object do tipo char assinado: SCHAR_MAX +127

CHAR_BIT mínimo de 8 garante que um caractere tenha pelo menos 8 bits de largura. Os intervalos em SCHAR_MIN e SCHAR_MAX garantem que a representação de um caractere assinado use pelo menos oito bits.

A primeira coisa que eu diria é que, se você precisa de um tipo para ser um número exato de bits, use um tipo específico de tamanho. Dependendo da sua plataforma, pode variar de __s8 para um tipo de 8 bits assinado no Linux para __int8 em VC ++ no Windows.

Agora, de acordo com Robert Love em seu capítulo sobre portabilidade em “Desenvolvimento do Kernel Linux”, ele afirma que o padrão C “deixa o tamanho dos tipos padrão em implementações, embora dita um tamanho mínimo”.

Em seguida, em uma nota de rodapé na parte inferior da página, ele diz: “Com exceção do char que é sempre 8 bits”

Agora eu não tenho certeza do que ele está baseando isso, mas talvez seja essa seção da especificação ANSI C ?

2.2.4.2 Limites numéricos

Uma implementação em conformidade deve documentar todos os limites especificados nesta seção, que devem ser especificados nos limites dos headers.h e float.h

“Tamanhos de tipos integrais limits.h”

Os valores indicados abaixo devem ser substituídos por expressões constantes adequadas para uso em diretivas de pré-processamento #if. Seus valores definidos pela implementação devem ser iguais ou maiores em magnitude (valor absoluto) àqueles mostrados, com o mesmo sinal.

número máximo de bits para o menor object que não é um campo de bits (byte)

CHAR_BIT 8

valor mínimo para um object do tipo char assinado

SCHAR_MIN -127

valor máximo para um object do tipo char assinado

SCHAR_MAX +127

valor máximo para um object do tipo unsigned char

UCHAR_MAX 255

valor mínimo para um object do tipo char

CHAR_MIN veja abaixo

valor máximo para um object do tipo char

CHAR_MAX veja abaixo

número máximo de bytes em um caractere multibyte, para qualquer locale suportado

MB_LEN_MAX 1

valor mínimo para um object do tipo short int

SHRT_MIN -32767

valor máximo para um object do tipo short int

SHRT_MAX +32767

valor máximo para um object do tipo unsigned short int

USHRT_MAX 65535

valor mínimo para um object do tipo int

INT_MIN -32767

valor máximo para um object do tipo int

INT_MAX +32767

valor máximo para um object do tipo unsigned int

UINT_MAX 65535

valor mínimo para um object do tipo long int

LONG_MIN -2147483647

valor máximo para um object do tipo long int

LONG_MAX +2147483647

valor máximo para um object do tipo unsigned long int

ULONG_MAX 4294967295

Se o valor de um object do tipo char sign-extends for usado em uma expressão, o valor de CHAR_MIN deverá ser o mesmo que o de SCHAR_MIN e o valor de CHAR_MAX deverá ser o mesmo que SCHAR_MAX. Se o valor de um object do tipo char não estender o sinal quando usado em uma expressão, o valor de CHAR_MIN será 0 e o valor de CHAR_MAX será igual ao de UCHAR_MAX ./7/