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 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?

Foi útil?

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 seria sizeof(char) sob essa implementação? o que seria ser as gamas de menor e maior Tipo int?

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 de sizeof(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).

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