Системе, где 1 байт!= 8 бит? [дубликат]



этот вопрос уже есть ответ здесь:




  • Какие платформы имеют что-то другое, чем 8-битный символ?

    12 ответов



все время я читаю такие предложения, как




Не полагайтесь на 1 байт размером 8 бит



использовать CHAR_BIT вместо 8 в качестве константы для преобразования между битами и байты




и так далее. Какие системы реальной жизни существуют сегодня, где это справедливо?
(я не уверен, есть ли различия между C и C++ относительно этого, или если это на самом деле язык агностик. Пожалуйста, поставьте ретаг, если это необходимо.)

732   9  

9 ответов:

на старых машинах коды размером менее 8 бит были довольно распространены, но большинство из них были мертвы и ушли в течение многих лет.

C и C++ топ a минимум 8 бит на char, по крайней мере, до стандарта C89. [Изменить: например, C90, §5.2.4.2.1 требует CHAR_BIT >= 8 и UCHAR_MAX >= 255. C89 использует другой номер раздела (I верить это было бы §2.2.4.2.1), но идентичное содержание]. Они рассматривают "char " и" byte " как по существу синонимичный [Edit: например,CHAR_BIT описывается как: "количество битов для самого маленького объекта, который не является битовым полем (байтом)".]

есть, однако, текущие машины (в основном DSPs), где самый маленький тип больше 8 бит-минимум 12, 14 или даже 16 бит довольно распространен. Windows CE делает примерно то же самое: его наименьший тип (по крайней мере, с компилятором Microsoft) составляет 16 бит. Они делают не, однако, лечить char Как 16 бит-вместо этого они возьмите (несоответствующий) подход, просто не поддерживая тип с именем char на всех.

сегодня, в мире C++ на процессорах x86, довольно безопасно полагаться на один байт, являющийся 8 битами. Процессоры, где размер слова не является силой 2 (8, 16, 32, 64) очень редкость.

ТАК БЫЛО НЕ ВСЕГДА.

центральный процессор Control Data 6600 (и его братья) использовал 60-битное слово и мог обращаться только к слову за раз. В одном смысле, "байт" на CDC 6600 был 60 бит.

оборудование указателя байта DEC-10 работало с байтами произвольного размера. Указатель байта включал размер байта в битах. Я не помню, могли ли байты охватывать границы слов; я думаю, что они не могли, а это означало, что у вас было бы несколько ненужных битов на слово, если размер байта не был 3, 4, 9 или 18 бит. (DEC-10 использовал 36-битное слово.)

Если вы не пишете код, который может быть полезен на DSP, вы полностью вправе предположить, что байты-это 8 бит. Весь мир не может быть VAX (или Intel), но весь мир должен общаться, обмениваться данными, устанавливать общие протоколы и т. д. Мы живем в эпоху интернета, построенную на протоколах, построенных на октетах, и любая реализация C, где байты не являются октетами, будет очень трудно использовать эти протоколы.

также стоит отметить, что как POSIX, так и Windows имеет (и мандат) 8-разрядные байты. Это охватывает 100% интересных не встроенных машин, и в наши дни большая часть не-DSP встроенных систем, а также.

с Википедия:

размер байта был сначала выбрано, чтобы быть кратным существующим коды телетайпа, в частности 6-битные коды, используемые армией США (Fieldata) и военно-морской флот. В 1963 году, чтобы закончить использование несовместимого телепринтера коды по различным ветвям Правительство США, ASCII, 7-битный код, была принята в качестве Федеральной информации Обрабатывая стандарт, делая 6 битов байты коммерчески устарели. В ранний 1960-е годы, AT&T представила цифровой Телефония первая на междугородней магистрали русло. Они использовали 8-битный µ-закон кодирование. Это большие инвестиции пообещали снизить затраты на передачу для 8-разрядных данных. Использование 8-разрядных кодов для цифровой телефонии также вызвано 8-битные данные "октеты" должны быть приняты в качестве основная единица данных раннего Интернет.

как средний программист на основных платформах, вы делаете не нужно слишком беспокоиться об одном байте не 8 бит. Тем не менее, я бы все равно использовал CHAR_BIT константа в моем коде и assert (или лучше static_assert) любые места, где вы полагаетесь на 8 бит байт. Это должно поставить вас на безопасную сторону.

(Я не знаю ни одной соответствующей платформы, где это не соответствует действительности).

во-первых, количество бит в char формально не зависит от "системы" или от "машины", хотя эта зависимость обычно подразумевается здравым смыслом. Количество битов в char зависит только от реализация (т. е. компилятор). Нет проблем с реализацией компилятора, который будет иметь более 8 бит в char для любой "обычной" системы или машины.

во-вторых, есть несколько встроенных платформ, где sizeof(char) == sizeof(short) == sizeof(int) , каждый из которых имеет 16 бит (я не помню точных названий этих платформ). Кроме того, хорошо известные машины Cray имели аналогичные свойства со всеми этими типами, имеющими 32 бита в них.

в истории существует куча странных архитектур, которые не используют собственные размеры слов, которые кратны 8. Если вы когда-нибудь столкнетесь с этим сегодня, дайте мне знать.

  • первый коммерческий процессор от Intel был Intel 4004 (4-бит)
  • PDP-8 (12-бит)

размер байта имеет исторически были зависит от аппаратного обеспечения и не существуют окончательные стандарты, которые мандат размер.

Это может быть хорошая вещь, чтобы иметь в виду, если вы делаете много встроенных вещей.

Я делаю много встроенных и в настоящее время работает на DSP код с CHAR_BIT 16

добавление еще одного в качестве ссылки, из Википедии запись на HP Saturn:

архитектура Saturn основана на nibble; то есть основная единица данных-это 4 бита, которые могут содержать одну двоично-десятичную цифру (BCD).

Comments

    Ничего не найдено.