Czy są maszyny (lub kompilatory), gdzie sizeof(char) != 1
?
Czy norma C99 mówi, że sizeof(char)
implementacja zgodności ze standardami MUSI wynosić dokładnie 1? Jeśli tak, podaj mi numer sekcji i cytat.
Aktualizacja:
Jeśli mam komputer (procesor), który nie może adresować bajtów (minimalny odczyt to 4 bajty, wyrównane), ale tylko 4-s bajtów ( uint32_t
), czy kompilator dla tej maszyny może zdefiniować sizeof(char)
na 4? sizeof(char)
będzie 1, ale znak będzie miał 32 bity ( CHAR_BIT
makra)
Update2: Ale sizeof wynik NIE JEST BYTEM! to jest rozmiar CHAR. A znak może mieć 2 bajty lub (może być) 7 bitów?
Aktualizacja 3:
Ok. Wszystkie maszyny mają sizeof(char) == 1
. Ale jakie maszyny mają CHAR_BIT > 8
?
char
(zamiastwchar
). Nawet jeśli standard mówi, żesizeof(char)
musi to być 1, nie polegałbym na tym założeniu.sizeof(char)
zawsze wynosi 1, nawet jeśli znak jest 32-bitowy (jak to ma miejsce w niektórych systemach). C ma mnóstwo fajnych brodawek.sizeof(char) == sizeof(short) && sizeof(char) == sizeof(int)
na tych; nie pamiętam,sizeof(int) == sizeof(long)
czy CHAR_BIT miał 32 czy 64; spodziewam się, że było to 32 i myślęsizeof(long) == 1
też). (Możesz znaleźć odniesienie do podręcznika Cray C , ale nie dostęp do niego online ).Odpowiedzi:
Jest to zawsze jeden w C99, sekcja 6.5.3.4:
Edycja: nie jest częścią twojego pytania, ale do zainteresowania ze strony Harbison and Steele, wyd. (przed c99) str. 148:
Edycja: W odpowiedzi na zaktualizowane pytanie istotne jest następujące pytanie i odpowiedź od Harbison and Steele (ibid, Ex. 4 w Rozdziale 6):
Odpowiedź (ibid, s. 382):
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, żesizeof(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: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 achar
.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//−(27−1)**
- maksymalna wartość dla obiektu typu signed char
**SCHAR_MAX +127//27−1**
- maksymalna wartość dla obiektu typu unsigned char
**UCHAR_MAX 255//28−1**
- minimalna wartość dla obiektu typu char
- maksymalna wartość dla obiektu typu char
[…]
źródło
sizeof(char)
: jest to kolejny przedmiot do debaty / sprawdzenia / itp. w twoich konwencjach / standardach / wytycznych kodowania, marnuje mój czas na zastanawianie się, czy naprawdę znasz C i co jeszcze może być niepoprawne, zajmuje wizualną / mentalną / tekstową "przepustowość".Nie ma maszyn, w których
sizeof(char)
jest 4. To zawsze 1 bajt. Ten bajt może zawierać 32 bity, ale jeśli chodzi o kompilator C, jest to jeden bajt. Aby uzyskać więcej informacji, wskażę Ci C ++ FAQ 26.6 . Ten odsyłacz całkiem dobrze to opisuje i jestem prawie pewien, że C ++ ma wszystkie te reguły z C. Możesz również spojrzeć na comp.lang.c FAQ 8.10 dla znaków większych niż 8 bitów.Tak, to bajty. Powtórzę to.
sizeof(char)
to 1 bajt według kompilatora C. To, co ludzie potocznie nazywają bajtem (8 bitów), niekoniecznie jest tym samym, co kompilator C nazywa bajtem. Liczba bitów w bajcie C różni się w zależności od architektury twojego komputera. Gwarantowane jest również co najmniej 8.źródło
PDP-10
i PDP-11były.Aktualizacja:
nie ma kompilatorów C99 dla PDP-10.Niektóre modele 32-bitowego procesora SHARC DSP firmy Analog Devices mają CHAR_BIT = 32, a procesor Texas Instruments DSP z TMS32F28xx ma CHAR_BIT = 16, podobno .
Aktualizacja: Istnieje GCC 3.2 dla PDP-10 z CHAR_BIT = 9 (sprawdź include / limits.h w tym archiwum).
źródło