Столько ответов и только один частично правильный. Нельзя же людей вводить в заблуждение. В стандарте С (6.5.3.4 The sizeof operator)
When applied to an operand that has type char, unsigned char, or
signed char, (or a qualified version thereof) the result is 1.
и С++ (5.3.3 Sizeof)
sizeof(char), sizeof(signed char) and sizeof(unsigned char) are 1.
четко сказано, что тип char имеет размер ОДИН байт. Никакая система не может иметь компилятор, который поддерживает стандарт и который вернет в sizeof(char) что то другое. Иначе это нестандартный компилятор!
Теперь о "справедливом" равенстве sizeof(char) == sizeof(int). Не нужно путать значение возвращаемое sizeof с возвращаемым типом, потому что sizeof возвращает тип int и в этом смысле да, равенство может быть. И даже такое равенство может быть 'c' != 0, потому что 'c' будет выровнено до типа int, опять же стандарт. Но, литерал 'c' имеет тип char и поэтому sizeof('c') вернет единицу и, да, типа int.
Далее, язык программирования и его реализация на разных платформах это разные вещи. И если квант хранения информации не позволяет хранить один байт, то тогда, да, однобайтовый тип будет храниться в двух и более байтах в зависимости от минимального кванта информации системы. Но это никакого отношения не имеет к sizeof(char).
Теперь о дурацком примере, который вводит в еще большее заблуждение.
if (getchar() == EOF)
Естественно, что возвращаемое значение getchar() будет выровнено до int со своим значением, т.е. до 0x000000FF и конечно это не будет равно 0xFFFFFFFF.
Следующий более интересный вариант.
if ('\xff' == EOF)
А тут мы сравнивает (char)-1 с (int)-1, почему? Да потому что произошла конвертация из char в int и -1 превратился снова в -1.
UPD: По итогам обсуждения
Стандарт С++ имеет понятие байт и если речь идет об операторе sizeof, то в в этом случае размер возвращается именно в байтах. И хотя в определениях диапазонов и в примерах приводятся значения требующие именно восьми бит, сама битность напрямую в стандарте не определяется. Требуется только то, чтобы байт смог как минимум разместить все зарезервированные в стандарте символы.
Что касается самого определения байта, то оно есть в стандарте IEC 80000 и определяется именно как октет, восемь бит. Любая документация прямо не указывающая размерность байта основывается на стандарте. Но, стандарт не закон, поэтому отклонения могут быть. Например дополнительные биты могут быть использованы для контроля целостности информации или в других служебных целях, но для пользователя все равно будет видны только восемь бит. Любое другое отклонение это скорее анахронизм.
Это абсурд....
– AseN Jun 09 '12 at 21:02Но, в некоторых (старых) машинах побайтной адресации не было вообще. Символы (для ввода-вывода) упаковывали в машинное слово. Например на БЭСМ (если ничего не путаю) в 48-разрядном слове хранили 8 6-разрядных символов.
Правда и Си IMHO для них не было. (Сам с такими машинами не встречался, только читал упоминания об этом).
– avp Jun 09 '12 at 21:17sizeof(char)выравнивание все-таки никак не влияет :) – M. Williams Jun 10 '12 at 04:05Надо смотреть, насколько критический код лежит ниже проверки.
– Oct 26 '12 at 19:51Сами (в своими ручками писанных программах)
sizeof(char) != 1видели?Если да, то опишите систему, компилятор и т.д.
– avp Oct 31 '12 at 10:21Кто и зачем минусовал Ваш ответ - не представляю.
– avp Oct 31 '12 at 14:41_TCHAR, а это ни разу неchar. – gecube Nov 01 '12 at 19:52C? – M. Williams Nov 01 '12 at 20:09charчерезbyte:) – M. Williams Nov 01 '12 at 20:25А когда определяют sizeof(char)==1byte, то не уточняют сколько бит в байте.
– avp Nov 01 '12 at 21:14