É sempre um em C99, seção 6.5.3.4:
Quando aplicado a um operando que tem tipo char, unsigned char, ou signed char, (ou uma versão qualificada disso) o resultado é 1.
Edit: não faz parte da sua pergunta, mas pelo interesse de Harbison e Steele, 3ª ed. (antes de 99) p. 148:
Uma unidade de armazenamento é considerada a quantidade de armazenamento ocupada por um personagem; o tamanho de um objeto de tipo char
é, portanto, 1.
Edit: Em resposta à sua pergunta atualizada, a seguinte pergunta e resposta de Harbison e Steele são relevantes (ibid, Ex. 4 do Cap. 6):
É permitido ter uma implementação C em que tipo char
pode representar valores que variam de -2.147.483.648 a 2.147.483.647? Em caso afirmativo, o que estaria sizeof(char)
sob essa implementação? Quais seriam os menores e maiores intervalos de tipo int
?
Resposta (ibid, p. 382):
É permitido (se desperdício) para uma implementação usar 32 bits para representar o tipo char
. Independentemente da implementação, o valor de
sizeof(char)
é sempre 1.
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 que sizeof(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:
O operador sizeof produz o tamanho (em bytes) de seu operando
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 a char
.
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)
**CHAR_BIT 8**
- valor mínimo para um objeto do tipo char assinado
**SCHAR_MIN -127//−(27−1)**
- valor máximo para um objeto do tipo char assinado
**SCHAR_MAX +127//27−1**
- valor máximo para um objeto do tipo unsigned 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 for tratado como um inteiro com sinal quando usado em uma expressão, o valor de CHAR_MIN deve ser o mesmo de SCHAR_MIN e o valor de CHAR_MAX deve ser o mesmo de SCHAR_MAX. Caso contrário, o valor de CHAR_MIN deve ser 0 e o valor de CHAR_MAX deve ser o mesmo de UCHAR_MAX. O valor UCHAR_MAX deve ser igual a 2 ^ CHAR_BIT - 1.