Jest to zawsze jeden w C99, sekcja 6.5.3.4:
Po zastosowaniu do operandu, który ma typ char, unsigned char lub signed char (lub jego kwalifikowaną wersję), wynikiem jest 1.
Edycja: nie jest częścią twojego pytania, ale do zainteresowania ze strony Harbison and Steele, wyd. (przed c99) str. 148:
Za jednostkę pamięci przyjmuje się ilość miejsca zajmowanego przez jedną postać; wielkość typu obiektu char
wynosi zatem 1.
Edycja: W odpowiedzi na zaktualizowane pytanie istotne jest następujące pytanie i odpowiedź od Harbison and Steele (ibid, Ex. 4 w Rozdziale 6):
Czy dopuszczalna jest implementacja C, w której typ char
może reprezentować wartości z przedziału od -2 147 483 648 do 2 147 483 647? Jeśli tak, co będzie w sizeof(char)
ramach tego wdrożenia? Jakie byłyby najmniejsze i największe zakresy czcionek int
?
Odpowiedź (ibid, s. 382):
Dozwolone jest (jeśli jest to marnotrawstwo), aby implementacja używała 32 bitów do reprezentowania typu char
. Niezależnie od implementacji wartość
sizeof(char)
zawsze wynosi 1.
Chociaż nie dotyczy to konkretnie przypadku, w którym, powiedzmy, bajty mają 8 bitów i char
są 4 z tych bajtów (w rzeczywistości niemożliwe z definicją c99, patrz poniżej), fakt, że sizeof(char) = 1
zawsze jest jasny ze standardu c99 oraz Harbison i Steele.
Edycja: W rzeczywistości (jest to odpowiedź na twoje pytanie Upd 2), jeśli chodzi o c99 sizeof(char)
jest w bajtach, z sekcji 6.5.3.4 ponownie:
Operator sizeof zwraca rozmiar (w bajtach) swojego operandu
więc w połączeniu z powyższym cudzysłowem bajty 8-bitowe i char
4 z tych bajtów są niemożliwe: dla c99 bajt to to samo, co a char
.
W odpowiedzi na twoją wzmiankę o możliwości 7 bitów char
: nie jest to możliwe w c99. Zgodnie z sekcją 5.2.4.2.1 normy minimum to 8:
Ich wartości zdefiniowane w ramach realizacji powinny być równe lub większe [podkreślenie moje] pod względem wielkości od pokazanych, z tym samym znakiem.
- liczba bitów dla najmniejszego obiektu, który nie jest polem bitowym (bajtem)
**CHAR_BIT 8**
- minimalna wartość dla obiektu typu signed char
**SCHAR_MIN -127
- maksymalna wartość dla obiektu typu signed char
**SCHAR_MAX +127
- maksymalna wartość dla obiektu typu unsigned char
**UCHAR_MAX 255
- minimalna wartość dla obiektu typu char
**CHAR_MIN** see below
- maksymalna wartość dla obiektu typu char
**CHAR_MAX** see below
[…]
Jeżeli wartość obiektu typu char jest traktowana jako liczba całkowita ze znakiem, gdy jest używana w wyrażeniu, wartość CHAR_MIN powinna być taka sama jak wartość SCHAR_MIN, a wartość CHAR_MAX będzie taka sama jak wartość SCHAR_MAX. W przeciwnym razie wartość CHAR_MIN będzie wynosić 0, a wartość CHAR_MAX będzie taka sama jak wartość UCHAR_MAX. Wartość UCHAR_MAX będzie wynosić 2 ^ CHAR_BIT - 1.