Existem máquinas (ou compiladores), onde sizeof(char) != 1
?
O padrão C99 diz que sizeof(char)
a implementação de conformidade com o padrão DEVE ser exatamente 1? Em caso afirmativo, por favor, me dê o número da seção e citação.
Atualização:
Se eu tiver uma máquina (CPU), que não pode endereçar bytes (leitura mínima é 4 bytes, alinhados), mas apenas 4-s de bytes ( uint32_t
), o compilador para esta máquina pode definir sizeof(char)
para 4? sizeof(char)
será 1, mas char terá 32 bits ( CHAR_BIT
macros)
Update2: Mas o resultado sizeof NÃO é um BYTES! é do tamanho de CHAR. E char pode ter 2 bytes ou (pode ser) 7 bits?
Update3:
Ok. Todas as máquinas têm sizeof(char) == 1
. Mas quais máquinas têm CHAR_BIT > 8
?
char
(em vez dewchar
.) Mesmo se o padrão disser quesizeof(char)
deve ser 1, eu não confiaria nessa suposição.sizeof(char)
é sempre 1, mesmo que char seja de 32 bits (como acontece em alguns sistemas). C tem muitas verrugas divertidas.sizeof(char) == sizeof(short) && sizeof(char) == sizeof(int)
nessas; não me lembrosizeof(int) == sizeof(long)
se CHAR_BIT tinha 32 ou 64; acho que era 32, e acho quesizeof(long) == 1
também. (Você pode encontrar uma referência, mas não o acesso online a, um manual do Cray C. )Respostas:
É sempre um em C99, seção 6.5.3.4:
Edit: não faz parte da sua pergunta, mas pelo interesse de Harbison e Steele, 3ª ed. (antes de 99) p. 148:
Edit: Em resposta à sua pergunta atualizada, a seguinte pergunta e resposta de Harbison e Steele são relevantes (ibid, Ex. 4 do Cap. 6):
Resposta (ibid, p. 382):
Embora isso não trate especificamente de um caso em que, digamos, os bytes tenham 8 bits e
char
sejam 4 desses bytes (na verdade, impossível com a definição c99, veja abaixo), o fato de quesizeof(char) = 1
sempre fica claro no padrão c99 e em Harbison e Steele.Edit: Na verdade (isso é em resposta à sua pergunta sobre o Upd 2), no que diz respeito a c99
sizeof(char)
está em bytes, da seção 6.5.3.4 novamente:então combinado com a citação acima, bytes de 8 bits e
char
4 desses bytes é impossível: para c99 um byte é o mesmo que achar
.Em resposta à sua menção à possibilidade de 7 bits
char
: isso não é possível em c99. De acordo com a seção 5.2.4.2.1 da norma, o mínimo é 8:Seus valores definidos pela implementação devem ser iguais ou maiores [grifo meu] em magnitude aos mostrados, com o mesmo sinal.
- número de bits para o menor objeto que não é um campo de bits (byte)
- valor mínimo para um objeto do tipo char assinado
- valor máximo para um objeto do tipo char assinado
- valor máximo para um objeto do tipo unsigned char
- valor mínimo para um objeto do tipo char
- valor máximo para um objeto do tipo char
[...]
fonte
sizeof(char)
: é outro item para debater / verificar / etc. em suas convenções / padrões / diretrizes de codificação, perco meu tempo imaginando se você realmente conhece C e o que mais pode estar incorreto, ocupa "largura de banda" visual / mental / linha de texto.Não há máquinas onde
sizeof(char)
é 4. É sempre 1 byte. Esse byte pode conter 32 bits, mas no que diz respeito ao compilador C, é um byte. Para obter mais detalhes, na verdade vou apontar para C ++ FAQ 26.6 . Esse link o cobre muito bem e estou quase certo de que C ++ obteve todas essas regras de C. Você também pode consultar comp.lang.c FAQ 8.10 para caracteres maiores que 8 bits.Sim, são bytes. Deixe-me dizer isso novamente.
sizeof(char)
é 1 byte de acordo com o compilador C. O que as pessoas chamam coloquialmente de byte (8 bits) não é necessariamente o mesmo que o compilador C chama de byte. O número de bits em um byte C varia dependendo da arquitetura de sua máquina. Também é garantido que seja pelo menos 8.fonte
PDP-10
e PDP-11eram.Atualização:
não há compiladores C99 para PDP-10.Alguns modelos de Analog Devices de 32 bits SHARC DSP têm CHAR_BIT = 32, e Texas Instruments DSP de TMS32F28xx tem CHAR_BIT = 16, supostamente .
Atualização: Existe GCC 3.2 para PDP-10 com CHAR_BIT = 9 (verifique include / limits.h nesse arquivo).
fonte