Байт содержит 8 бит или 9?

56

В этом руководстве по программированию сборки я прочитал, что 8 бит используются для данных, а 1 бит - для контроля четности, который затем используется для обнаружения ошибки контроля четности (вызванной неисправностью оборудования или электрическими помехами).

Это правда?

ХТТ
источник
5
См. Cs.stackexchange.com/a/19851/584 для обсуждения того, каким может быть байт .
AProgrammer
63
Эта статья наполнена ерундой, и вы должны ее игнорировать.
Дэвид Шварц
12
Если вы хотите быть педантичным, просто назовите их «октеты». Эта статья либо написана с очень специфическим процессором (который по какой-то причине должен сохранять биты четности в ПЗУ ...), либо просто ненормальная. Микросхемы PIC, например, используют 14-битную длину слова. Вся память программы организована в массиве N x 14 бит.
Ник Т
13
@NickT: это не одно и то же. Октет всегда 8 бит, байт может быть чем угодно.
Йорг Миттаг
4
Возможно, статья ссылалась на механизмы коррекции памяти, которые использовались на некоторых ранних компьютерах IBM, но заявлять, что «байт - это 8-битные данные + 1-битная четность» - полная чушь. Например, на CD-ROM обычно используются механизмы исправления ошибок, которые гораздо более жадные - типичный аудио-CD будет использовать 8 байтов на 24 байта аудиоданных. Но самая важная часть в том, что вам все равно . Вообще. Это исключительно для реального механизма хранения памяти - процессору все равно, вашему коду нет дела.
Луаан

Ответы:

78

Байт данных составляет восемь битов, может быть больше битов на байт данных, которые используются в ОС или даже на аппаратном уровне для проверки ошибок (бит четности или даже более продвинутая схема обнаружения ошибок), но данные - восемь биты и любой бит четности обычно невидимы для программного обеспечения. Байт был стандартизирован для обозначения «восьми бит данных». Текст не ошибается, говоря, что может быть больше битов, предназначенных для хранения байта данных, чем восемь битов данных, но они обычно не считаются частью байта как такового, сам текст указывает на этот факт.

Вы можете увидеть это в следующем разделе учебника:

Doubleword: a 4-byte (32 bit) data item

4 * 8 = 32, на самом деле это может занять 36 бит в системе, но для ваших целей и задач это только 32 бит.

JustAnotherSoul
источник
5
Что ж, если аппаратное обеспечение реализует обнаружение ошибок, оно, вероятно, будет делать это с большими кусками памяти, чем с байтом, например, с 512-байтовыми секторами или около того ... таким образом, вы можете уменьшить накладные расходы, необходимые для дополнительной памяти. Просто для пояснения: даже с исправлением ошибок аппаратное обеспечение все еще использует 8-битный на байт плюс несколько битов для каждого «куска» данных, который, вероятно, намного больше, чем один байт.
Бакуриу
11
Обратите внимание, что существуют системы с видимыми программным обеспечением не 8-битными байтами. Посмотрите, на каких платформах есть что-то кроме 8-битного символа? вопрос на StackOverflow.
Руслан
3
Да, они действительно существуют. Хотя эта конкретная ссылка говорит о не 8-битных символах. Как бы то ни было: байт использовался просто для обозначения количества битов, которое данная система взяла для хранения «символа», который составлял всего шесть битов. Но IIRC стандартизирован в спецификации IEC-80000, что байт является 8-битным. Уходя от основных систем, вы, конечно, обнаруживаете странности, а стандарты не являются законами.
JustAnotherSoul
3
@JustAnotherSoul: И есть конкурирующие стандарты, которые определяют байт как «по крайней мере 8 бит» или другими способами. Интересно посмотреть, как спустя десятилетия определение байта меняется в сознании людей. Во времена гораздо большей архитектурной неоднородности байт был просто наименьшей адресуемой единицей в вашей архитектуре (посмотрите на различные PDP для примеров). Это также является причиной того, что в появлении Интернета термин octet использовался для описания данных в сети, поскольку байт не был универсальным словом для фрагмента 8-битных данных.
PlasmaHH
2
@JustAnotherSoul, обратите внимание, что charв C (о чем идет ссылка) это как раз самая маленькая адресуемая единица памяти. Он просто называется char , но стандарт C делает его синонимом байта .
Руслан
48

Традиционно, байт может быть любого размера и представляет собой наименьшую адресуемую единицу памяти. В наши дни 8-битные байты были в значительной степени стандартизированы для программного обеспечения. Как сказал JustAnotherSoul, аппаратное обеспечение может хранить больше битов, чем 8 бит данных.

Если вы работаете с программируемыми логическими устройствами, такими как ПЛИС, вы можете увидеть, что их внутренняя память часто адресуется как 9-битные блоки, а как автор HDL вы можете использовать этот 9-й бит для проверки ошибок или просто для хранения больших объемов данных на «байт». При покупке микросхем памяти для нестандартного оборудования у вас обычно есть выбор 8 или 9-битных адресуемых блоков (или 16/18, 32/36 и т. Д.), И затем вам решать, есть ли у вас 9-битные «байты» и что вы делаете с этим 9-м битом, если хотите.

Extrarius
источник
10
Обычно, когда есть группа данных, которая логически представляет собой единое целое, но содержит больше / меньше 8 бит, это называется «словом». Например, некоторые процессоры используют 40-битное командное слово.
Devsman
3
+1. Между прочим, были архитектуры с «битовыми указателями» и «байтовыми указателями». В таких архитектурах байт технически не является «наименьшей адресуемой единицей памяти» (поскольку вы можете адресовать каждый бит независимо), хотя сложно сказать, что это такое . Я думаю, это что-то вроде «я знаю, когда вижу». :-P
ruakh
18
«Октет» был традиционно используемым словом для обозначения «я бы назвал это байтом, но я действительно имею в виду ровно 8 бит» для различных протоколов связи между системами, которые могут иметь разные размеры байтов. Но в наши дни использование байта для обозначения чего угодно, кроме 8 бит, является анахронизмом.
Внуаз
@Devsman Не обязательно. Например, чипы x86 имеют 32-битные слова и 8-битные байты. Байт - это наименьший адресуемый размер. Слово немного более неопределенно определено, но имеет тенденцию быть размером, с которым удобнее всего работать; т.е. ожидаемая длина операнда большинства инструкций.
Рэй
Это должно быть помечено как правильный ответ, это более правильно.
awiebe
32

Этот текст очень плохо сформулирован. Он почти наверняка говорит о ECC (код с исправлением ошибок) RAM.

ECC ram обычно хранит 8-битную информацию, используя 9-битную. Дополнительный бит на байт используется для хранения кодов исправления ошибок.

ECC против не-ECC (В обоих случаях каждый байт распределяется по каждому чипу. Изображение предоставлено Puget Systems )

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


Кроме того: коды с исправлением ошибок в ОЗУ обычно не имеют значения 1 бит на байт; вместо этого они 8 бит на 8 байтов. Это имеет те же накладные расходы, но имеет некоторые дополнительные преимущества. Смотрите SECDED для получения дополнительной информации.

BlueRaja - Дэнни Пфлугхофт
источник
12
Оперативная и ECC RAM - это разные вещи. Оперативная память четности хранит один дополнительный бит на домен ошибок, может обнаруживать все однобитовые ошибки и никаких двухбитовых ошибок и ничего не может исправить. ECC хранит несколько дополнительных битов в каждой области ошибок, может обнаруживать и исправлять все однобитовые ошибки, может обнаруживать, но не исправлять все двухбитовые ошибки, и может отлавливать некоторые более крупные ошибки. Оперативное ОЗУ в наши дни встречается редко, его почти полностью заменило ECC RAM
Отметить
1
@Mark: я намекал на это в моем последнем абзаце, в ссылке есть более подробная информация. ОЗУ с контролем четности в наши дни практически не существует, поскольку код исправления ошибок (72,64) имеет те же издержки, что и код контроля четности (9,8).
BlueRaja - Дэнни Пфлугхофт
7
Хотя вы намекаете на это, вы также заявляете о вещах, которые делают его неточным / запутанным. ECC RAM не «хранит 8-битную информацию с использованием 9-битной информации». Это означает, что вы можете сделать ECC для 8 бит, используя 9 бит, что невозможно. Для 8 бит дискретной информации достаточно 1 дополнительного бита, чтобы обнаружить , а не исправить, ошибки одного бита. ECC используют большее количество битов или байтов, чтобы содержать данные, достаточные для исправления ошибок для групп данных, обычно больше одного байта. Хотя это может усреднять дополнительный бит на 8 битов, его нельзя разбить на сопоставление только 1 бита с каждыми 8 битами.
Макьен
Существует 36-битная схема (32-битное слово + 4-битное ECC), которая позволяет исправлять ошибки в одном бите и обнаруживать ошибки в двух битах. Хотя вы можете арифметически разделить его на 8 бит данных + 1 бит ECC, это не может / не работает таким образом. Требуются полные 4 бита ECC, которые охватывают 32 бита данных.
Zenilogix
@Zenilogix и другие, кто повторил то же самое: я очень хорошо понимаю, как работает ECC, и я ничего не сказал, что это неправильно. Я никогда не утверждал, что 8-битный ECC может быть сделан с 9-битным, я сказал, что ECC RAM использует 9-битный байт памяти. Принцип работы ECC полностью выходит за рамки этого вопроса, поэтому я оставил детали в стороне со ссылкой. Пожалуйста, прекратите все педантичные комментарии.
BlueRaja - Дэнни Пфлюгофт,
16

Вообще говоря, краткий ответ состоит в том, что байт равен 8 битам. Это упрощает вопрос (иногда даже до степени неточности), но это определение, с которым большинство людей (включая большое количество программистов) знакомо, и определение, которое почти все используют по умолчанию (независимо от того, сколько байтов разного размера они ' пришлось работать)

Более конкретно, байт является наименьшим адресуемым блоком памяти для данной архитектуры и, как правило, достаточно большой, чтобы содержать один текстовый символ. На большинстве современных архитектур байт определяется как 8 бит; ИСО / МЭК 80000-13 также указывает, что байт равен 8 битам, как и общепринятый консенсус (это означает, что если вы говорите, скажем, о 9-битных байтах, вы столкнетесь с большим количеством проблем, если не будете явно утверждают, что вы не имеете в виду нормальные байты).

Однако есть исключения из этого правила. Например:

Таким образом, в большинстве случаев байт обычно составляет 8 бит. Если нет, то это, вероятно, 9 бит, и может быть, а может и не быть частью 36-битного слова.

Джастин Тайм 2 Восстановить Монику
источник
8

Обратите внимание, что термин байт не определен без контекста. Что касается компьютерных архитектур, можно предположить, что байт является 8-разрядным, по крайней мере, для современных архитектур. Это было в значительной степени стандартизировано такими языками программирования, как C, которые требовали, чтобы байты имели по крайней мере 8 бит, но не давали никаких гарантий для больших байтов, делая 8 бит на байт единственным безопасным допущением.

Существуют компьютеры с адресуемыми единицами размером более 8 бит (обычно 16 или 32), но эти единицы обычно называются машинными словами, а не байтами. Например, DSP с 32 КБ 32-разрядными словами ОЗУ будет объявляться как имеющий 128 КБ или ОЗУ, а не 32 КБ.

Вещи не так хорошо определены, когда речь заходит о стандартах связи. ASCII по-прежнему широко используется и имеет 7-битные байты (которые хорошо вписываются в 8-битные байты на компьютерах). Приемопередатчики UART по-прежнему производятся с настраиваемым размером байта (обычно вы можете выбрать по крайней мере от 6, 7 до 8 бит на байт, но 5 и 9 не являются неслыханными).

Дмитрий Григорьев
источник
6

Байт обычно определяется как наименьшая индивидуально адресуемая единица пространства памяти. Это может быть любой размер. Существуют архитектуры с размером байтов от 6 до 9 бит, может быть, даже больше. Существуют также архитектуры, в которых единственная адресуемая единица измерения - это размер шины. На таких архитектурах мы можем либо сказать, что у них просто нет байта , либо размер байта совпадает со словом (в одном конкретном случае, который я знаю, это быть 32-битным); в любом случае, это определенно не 8 бит. Аналогично, существуют архитектуры с битовой адресацией, на этих архитектурах мы могли бы снова утверждать, что байты просто не существуют, или мы могли бы утверждать, что байты 1 бит; В любом случае это разумное определение, но 8 бит определенно неверно.

На многих основных архитектурах общего назначения один байт содержит 8 бит. Однако это не гарантируется. Чем дальше вы отклоняетесь от основного и / или от процессоров общего назначения, тем больше вероятность того, что вы встретите не 8-битные байты. Это заходит так далеко, что некоторые высокопортативные программы даже позволяют настраивать размер. Например, более старые версии GCC содержали макрос, называемый BITS_PER_BYTE(или что-то подобное), который настраивал размер байта для конкретной архитектуры. Я полагаю, что некоторые старые версии NetBSD могут работать на не-8-битных архитектурах.

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

Йорг Миттаг
источник
2
Стандарт C и C ++ имеют предопределенный макрос CHAR_BIT(найден в limits.h), я не в курсеBITS_PER_BYTE
njuffa
3

Когда я начал программировать в 1960 году, у нас было 48-битные слова с 6-битными байтами - тогда они не называли это имя, их называли символами. Затем я работал на компьютере Golem с 75-битными словами и 15-битными байтами. Позже, 6-битные байты были нормой, пока IBM не выпустила 360, и в настоящее время байт обычно эквивалентен октету, то есть 8 битам данных. У некоторого оборудования были дополнительные биты для обнаружения ошибок и, возможно, для исправления ошибок, но они не были доступны для программного обеспечения.

Джонатан Розен
источник
3

Байт 8 бит.

В далеком прошлом существовали разные определения слова памяти и байта. Предположение, что эта двусмысленность широко распространена или распространена в современной жизни, является ложным.

По крайней мере, с конца 1970-х годов размер байта составлял 8 бит. Массовое население домашних компьютеров и ПК однозначно использовало байт в качестве 8-битного значения в своей документации, равно как и все листы данных и документацию для гибких дисков, жестких дисков и PROM / EPROM / EEPROM / Flash EPROM. / SRAM / SDRAM микросхемы памяти, которые я прочитал за этот период времени. (И я лично прочитал многие из них прямо за это время.) Ethernet и несколько других протоколов связи выделяются для меня как необычные в разговорах об октетах.

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

Когда байт обрабатывается аппаратным обеспечением, например, когда он хранится в микросхемах памяти или передается по проводам, аппаратное обеспечение может добавлять избыточные данные в байт. Позже это может помочь в обнаружении аппаратных ошибок, так что ненадежные данные могут быть распознаны и отброшены (например, четность, контрольная сумма, CRC). Или это может позволить исправить ошибки в данных и восстановить данные (например, ECC). В любом случае избыточные данные будут отброшены, когда байт будет извлечен или получен для дальнейшей обработки. Байт остается центральным 8-битным значением, а избыточные данные остаются избыточными данными.

TonyM
источник
2

Во-первых, учебник, на который вы ссылаетесь, кажется довольно устаревшим, и, по-видимому, он направлен на устаревшие версии процессоров x86, не говоря об этом, поэтому многие вещи, которые вы читаете там, не будут поняты другими (например, если вы заявляете что WORD составляет 2 байта, люди либо не будут знать, о чем вы говорите, либо узнают, что вас учили на основе очень устаревших процессоров x86, и будут знать, чего ожидать).

Байт - это любое количество бит, которое кто-то решит принять. Это может быть 8-битный, или 9-битный, или 16-битный, что угодно. В 2016 году в большинстве случаев байт будет восьмибитным. Чтобы быть в безопасности, вы можете использовать термин октет - октет всегда, всегда, восемь битов.

Настоящая путаница здесь ставит в тупик два вопроса: 1. Какое количество битов в байте? 2. Если бы я хотел перенести один байт из одного места в другое, или если бы я хотел сохранить байт, используя практические физические средства, как бы я это сделал? Второй вопрос, как правило, вас мало интересует, если вы не работаете в компании, производящей модемы, жесткие диски или твердотельные накопители. На практике вас интересует первый вопрос, а на второй вы просто говорите: «Ну, кто-то за этим следит».

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

Биты четности практически не используются в этой примитивной форме. Данные, которые хранятся постоянно, обычно защищаются более сложными способами, например, путем добавления 32-битной или более длинной контрольной суммы к блоку из 1024 байтов, что занимает гораздо меньше дополнительного пространства (0,4% в этом примере вместо 12,5%) и значительно реже не узнать, когда что-то не так.

gnasher729
источник
Действительно устаревший: 16-байтовый «абзац» не был значимой единицей памяти с момента перехода из реального режима и сегментированной адресации.
Отметить
Лично я бы предположил «WinAPI», когда кто-то говорит о двухбайтовых значениях WORD, что ... вроде как подтверждает вашу точку зрения, поскольку многие имена типов WinAPI устарели, но сохранены для обратной совместимости. xP
Джастин Тайм 2 восстановит Монику
1

Несмотря на действительно превосходные ответы, данные здесь, я удивлен, что никто не указал, что биты четности или биты исправления ошибок по определению являются «метаданными» и поэтому не являются частью самого байта.

Байт имеет 8 бит !

user34445
источник
0

В современном использовании, байт составляет 8 битов, период (хотя у него исторически были другие определения). С другой стороны, слово данных - это то, что рассматриваемое аппаратное обеспечение рассматривает как атомарную единицу, - это может быть 8 бит, 9 бит, 10 бит, 12 бит, 16 бит, 20 бит, 24 бита, 32 бита и т. Д. Различные компьютеры системы на протяжении многих лет имели всевозможные размеры слов.

Чтобы реализовать систему памяти или протокол передачи, выгодно добавить обнаружение / исправление ошибок, которое включает дополнительные биты. Они не предназначены для 9-битного байта, потому что, как указано выше, байт равен 8 битам.

Различные схемы добавляют обнаружение и / или исправление ошибок различными способами.

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

Схема, которая может обеспечить исправление ошибок в одном бите, включает добавление 4 битов ECC на 32-разрядное слово данных. Просто случается, что это арифметически эквивалентно 1 биту на байт, но это не может / не работает таким образом. Одно 36-битное слово данных может нести достаточно информации для восстановления после однобитовой ошибки для 32-битного пространства данных.

Zenilogix
источник
0

8 бит Внутри процессора и клавиатуры это 9 и 11 бит. Пользовательские данные представлены в 8 битах. Клавиши на клавиатуре отправляют поющие, которые разделены на 11 бит. 1 начальный бит, 1 конечный бит, 1 бит четности и 8 бит, представляющих нажатую клавишу.

Сива
источник
2
Это отвечает на вопрос? Вы имеете в виду разные длины для байтов в процессоре и байтов в клавиатуре? Должно ли "поет" быть "струнами" или "потоками"?
Apass.Jack
Похоже, вы говорите о проводном протоколе, включая данные кадрирования, а не сами данные.
Питер Кордес
Я бы предположил, что «поет» - это «сигналы», сам @ Apass.Jack.
Джастин Тайм 2 Восстановить Монику