Есть машины (или компиляторы), где sizeof(char) != 1
?
В стандарте C99 сказано, что sizeof(char)
при стандартной реализации соответствия ДОЛЖНО быть ровно 1? Если да, то дайте мне номер раздела и ссылку.
Обновление:
если у меня есть машина (ЦП), которая не может адресовать байты (минимальное чтение составляет 4 байта, выровнено), но только 4 байта ( uint32_t
), может ли компилятор для этой машины определить sizeof(char)
4? sizeof(char)
будет 1, но у char будет 32 бита ( CHAR_BIT
макросы)
Update2: Но результат sizeof НЕ БАЙТОВ! это размер CHAR. А char может быть 2 байтовым, а может быть 7 битным?
Update3:
Хорошо. Все машины есть sizeof(char) == 1
. Но какие машины есть CHAR_BIT > 8
?
char
(вместоwchar
.). Даже если стандарт говорит, что этоsizeof(char)
должно быть 1, я бы не стал полагаться на это предположение.sizeof(char)
всегда 1, даже если char 32-битный (как это происходит в некоторых системах). У C много забавных бородавок.sizeof(char) == sizeof(short) && sizeof(char) == sizeof(int)
на них; я не помню, былоsizeof(int) == sizeof(long)
ли CHAR_BIT 32 или 64; я ожидаю, что это было 32, и яsizeof(long) == 1
тоже думаю . (Вы можете найти ссылку на руководство Cray C , но не доступ к нему в Интернете. )Ответы:
Это всегда один в C99, раздел 6.5.3.4:
Изменить: не часть вашего вопроса, но для интереса Харбисона и Стила, 3-е изд. (pre c99) стр. 148:
Изменить: в ответ на ваш обновленный вопрос актуален следующий вопрос и ответ от Харбисона и Стила (там же, пример 4 из главы 6):
Ответ (там же, с. 382):
Хотя это специально не касается случая, когда, скажем, байты равны 8 битам и
char
составляют 4 из этих байтов (что на самом деле невозможно с определением c99, см. Ниже), этот фактsizeof(char) = 1
всегда ясен из стандарта c99 и Харбисона и Стила.Edit: На самом деле (это в ответ на ваш вопрос UPD 2), насколько c99 обеспокоен
sizeof(char)
является в байтах, снова из раздела 6.5.3.4:поэтому в сочетании с приведенной выше цитатой, байты из 8 бит и
char
4 из этих байтов невозможны: для c99 байт совпадает сchar
.В ответ на ваше упоминание о возможности 7-битного
char
: это невозможно в c99. Согласно разделу 5.2.4.2.1 стандарта минимум 8:Их значения, определяемые реализацией, должны быть равны или больше [выделено мной] по величине показанных с тем же знаком.
- количество бит для наименьшего объекта, не являющегося битовым полем (байт)
**CHAR_BIT 8**
- минимальное значение для объекта типа signed char
**SCHAR_MIN -127//−(27−1)**
- максимальное значение для объекта типа signed char
**SCHAR_MAX +127//27−1**
- максимальное значение для объекта типа unsigned char
**UCHAR_MAX 255//28−1**
- минимальное значение для объекта типа char
- максимальное значение для объекта типа char
[...]
источник
sizeof(char)
: это еще один предмет для обсуждения / проверки и т. Д. в ваших соглашениях / стандартах / рекомендациях по кодированию, я трачу время на размышления о том, действительно ли вы знаете C, а что еще может быть неправильным, занимает визуальную / мысленную / текстовую «полосу пропускания».Нет машин, где
sizeof(char)
равно 4. Это всегда 1 байт. Этот байт может содержать 32 бита, но для компилятора C это один байт. Для получения более подробной информации я на самом деле собираюсь указать вам на C ++ FAQ 26.6 . Эта ссылка описывает это довольно хорошо, и я почти уверен, что C ++ получил все эти правила от C. Вы также можете посмотреть comp.lang.c FAQ 8.10 для символов размером более 8 бит.Да, это байты. Позвольте мне сказать это еще раз.
sizeof(char)
составляет 1 байт согласно компилятору C. То, что люди в просторечии называют байтом (8 бит), не обязательно совпадает с тем, что компилятор C называет байтом. Количество битов в байте C зависит от архитектуры вашего компьютера. Также гарантированно будет не менее 8.источник
PDP-10
и PDP-11были.Обновление:
компиляторов C99 для PDP-10 вроде нет.Некоторые модели Analog Devices 32-битного DSP SHARC имеют CHAR_BIT = 32, и Texas Instruments DSP от TMS32F28xx имеют CHAR_BIT = 16, по сообщениям .
Обновление: есть GCC 3.2 для PDP-10 с CHAR_BIT = 9 (проверьте include / limits.h в этом архиве).
источник