Existem máquinas, onde sizeof (char)! = 1, ou pelo menos CHAR_BIT> 8?
Pergunta
Existem máquinas (ou compiladores), onde sizeof(char) != 1
?
O padrão C99 diz que sizeof(char)
sobre a implementação conformidade com o padrão deve ser exatamente 1? Se isso acontecer, por favor, me dê número da seção e citação.
Atualização:
Se eu tiver uma máquina (CPU), que pode não bytes de endereço (mínimo de leitura é de 4 bytes, alinhados), mas apenas de 4 s de bytes (uint32_t
), pode compilador para esta máquina definir sizeof(char)
a 4 / strike> sizeof(char)
será 1, mas de char terá 32 bits (macros CHAR_BIT
)
Update2: Mas resultado sizeof não é um BYTES! é o tamanho de CHAR. E carvão pode ser de 2 bytes, ou (pode ser) 7 bit?
Update3:
Está bem. Todas as máquinas têm sizeof(char) == 1
. Mas o que as máquinas têm CHAR_BIT > 8
?
Solução
É sempre um em C99, do ponto 6.5.3.4:
Quando aplicado a um operando que tem tipo char não assinado carvão animal, ou assinado char, (ou uma versão dos mesmos qualificado) o resultado é 1.
Edit: não faz parte da sua pergunta, mas para o interesse de Harbison e Steele, 3ª ed. (Pré C99) p. 148:
A unidade de armazenamento é considerado como sendo o quantidade de armazenamento ocupado por um personagem; o tamanho de um objecto de Tipo
char
é, portanto, 1.
Edit: Em resposta à sua pergunta atualizado, a seguinte pergunta e resposta de Harbison e Steele é relevante (ibid, Ex 4 de Ch 6..):
É admissível para ter um C aplicação, no qual pode escrever
char
representam valores que vão desde -2.147.483.648 através de 2,147,483,647? Se assim for, o que seriasizeof(char)
sob essa implementação? o que seria ser as gamas de menor e maior Tipoint
?
Resposta (ibid, p 382.):
É permitido (se desperdício) para uma aplicação para usar 32 bits de representam tipo
char
. Independentemente de a implementação, o valor desizeof(char)
é sempre 1.
Enquanto isso não trata especificamente de um caso em que, dizem bytes são de 8 bits e char
são 4 desses bytes (na verdade impossíveis com a definição c99, veja abaixo), o fato de que sizeof(char) = 1
sempre é clara a partir do padrão c99 e Harbison e Steele.
Edit: Na verdade (isto é, em resposta à sua pergunta UPD 2), na medida em que está em causa c99 sizeof(char)
é em bytes, a partir do ponto 6.5.3.4 novamente:
O operador sizeof produz o tamanho (Em bytes) do seu operando
de modo combinado com a citação acima, bytes de 8 bits e char
como quatro desses bytes é impossível:. Para c99 um byte é o mesmo que um char
Em resposta à sua referência à possibilidade de um 7 bit char
: isso não é possível em c99. De acordo com a secção 5.2.4.2.1 do padrão do mínimo é 8:
Os valores definidos pelo implementação será igual ou superior [grifo meu] em magnitude aos mostrados, com o mesmo sinal.
- número de bits para menor objeto que não é um bit-campo (byte)
**CHAR_BIT 8**
- valor mínimo para um objeto do tipo assinado carvão
**SCHAR_MIN -127//−(27−1)**
- valor máximo para um objeto do tipo assinado carvão
**SCHAR_MAX +127//27−1**
- valor máximo para um objecto de tipo sem sinal de char
**UCHAR_MAX 255//28−1**
- valor mínimo para um objeto do tipo char
**CHAR_MIN** see below
- valor máximo para um objeto do tipo char
**CHAR_MAX** see below
[...]
Se o valor de um objeto do tipo char é tratado como um inteiro assinado quando utilizado em uma expressão, o valor de CHAR_MIN deve ser a mesma que a de SCHAR_MIN eo valor da CHAR_MAX deve ser a mesma que a de SCHAR_MAX. Caso contrário, o valor de CHAR_MIN será 0 e o valor de CHAR_MAX deve ser a mesma que a de UCHAR_MAX. O valor UCHAR_MAX será igual 2 ^ CHAR_BIT -. 1
Outras dicas
Não há máquinas onde sizeof(char)
é 4. É sempre 1 byte. Isso byte pode conter 32 bits, mas, tanto quanto o compilador C está em causa, é um byte. Para mais detalhes, eu estou indo realmente para que você aponte na C ++ FAQ 26,6 . Esse link cobre muito bem e estou bastante certo de C ++ tem todas essas regras de C. Você também pode olhar para FAQ comp.lang.c 8,10 para caracteres maiores que 8 bits.
Upd2: Mas sizeof resultado não é uma BYTES ! é o tamanho de CHAR. E poderá carbonizar ser 2 bytes, ou (pode ser) 7 bits?
Sim, é bytes. Deixe-me dizer isso novamente. sizeof(char)
é um byte de acordo com o compilador C. O que as pessoas coloquialmente chamar um byte (8 bits) não é necessariamente o mesmo que o compilador C chama um byte. O número de bits em um byte C varia de acordo com a sua arquitetura da máquina. Ele também é garantido que ser pelo menos 8.
PDP-10 e PDP-11 era.
Update:. lá como há compiladores C99 para PDP-10
Alguns modelos de Analog Devices 32 bits SHARC DSP tem CHAR_BIT = 32, e Texas Instruments DSP de TMS32F28xx tem CHAR_BIT = 16, supostamente .
Update: Há href="http://pdp10.nocrew.org/gcc/download/gcc-pdp10-20020611.tar.bz2" 3.2 para PDP-10 com CHAR_BIT = 9 (Verificação incluem / limits.h nesse arquivo).