Перейти к содержимому

Байт

Байт — группа битов, обрабатываемая вычислительной машиной как единое целое; с середины 1960-х годов повсеместно равна восьми битам и кодирует 256 разных значений. Байт служит базовой единицей адресации памяти и измерения объёма данных.

Почему в байте восемь бит

Термин byte придумал Вернер Бухгольц в 1956 году во время работы над машиной IBM Stretch. Написание через y выбрали намеренно, чтобы при беглом чтении и опечатках слово не сливалось с bit. Изначально байт определялся функционально: столько бит, сколько нужно для кодирования одного символа, и на разных архитектурах это были шесть, семь, восемь или девять бит. Машины с 36-битным словом делили его на шесть шестибитных байтов, и такое деление считалось нормой.

Восьмибитный байт закрепила IBM System/360 в 1964 году: разработчикам нужно было место и под расширенный набор символов, и под удобное представление десятичных цифр по две в байте. Архитектура оказалась настолько влиятельной, что за следующее десятилетие альтернативные размеры вымерли. Сегодня равенство «байт равен восьми битам» зафиксировано стандартом ISO/IEC 80000-13, а для случаев, где нужна абсолютная однозначность, стандарты связи применяют слово октет.

Восемь бит дают 2 в степени 8, то есть 256 комбинаций. Байт трактуют либо как беззнаковое число от 0 до 255, либо как знаковое от минус 128 до 127, либо как код символа, либо как набор из восьми независимых флагов. Обозначается байт заглавной латинской B или русским «Б»: 100 МБ и 100 Мб различаются в восемь раз.

Байт — минимальная адресуемая ячейка памяти. Процессор не читает отдельный бит: он забирает байт (а чаще машинное слово) и выделяет нужный разряд маской и сдвигом. Отсюда практическое следствие — логическое поле «да/нет» в структуре обычно занимает целый байт, если его специально не упаковали.

Что помещается в один байт

Кодировка ASCII занимает всего 7 бит и описывает 128 позиций: латиница, цифры, знаки препинания и управляющие символы. Восьмой бит долго оставался свободным и использовался то для контроля чётности, то для национальных расширений. На нём выросли однобайтовые кодировки на 256 позиций: ISO 8859-5, KOI8-R, Windows-1251 для кириллицы. Каждая раскладывала русские буквы по своим кодам, и несовпадение таблиц у отправителя и получателя даёт классическую нечитаемую последовательность символов.

Проблему решил Unicode с кодировкой UTF-8: символ занимает от одного до четырёх байт. Латиница осталась однобайтовой и совместимой с ASCII, кириллица занимает по два байта на букву, иероглифы — три, эмодзи и редкие знаки — четыре. Практический вывод для тех, кто рассчитывает вместимость кодов: русский текст в UTF-8 весит вдвое больше английского той же длины в символах.

Байтами измеряют и всё остальное: цвет пикселя в модели RGB — три байта, IPv4-адрес — четыре байта, MAC-адрес — шесть байт, дайджест SHA-256 — 32 байта, MD5 — 16 байт.

Килобайт: 1000 или 1024

Двоичная природа адресации сделала удобной степень двойки: 2 в степени 10 равно 1024, и объёмы памяти исторически считали именно так. Приставка «кило» при этом означает 1000 в системе СИ, отсюда десятилетия неоднозначности.

Стандарт IEC 60027-2, а затем ISO/IEC 80000-13 развели значения. Десятичные единицы: килобайт равен 1000 байт, мегабайт — миллион, гигабайт — миллиард. Двоичные: кибибайт (КиБ) равен 1024 байтам, мебибайт (МиБ) — 1 048 576, гибибайт (ГиБ) — 1 073 741 824.

На практике соглашения разошлись по индустриям. Производители накопителей считают по СИ, поэтому диск с надписью «1 ТБ» содержит триллион байт. Windows показывает объём в двоичных единицах, но подписывает их как «ГБ», и тот же диск отображается как 931 ГБ — ничего не пропало, разница составляет ровно 1024 в третьей степени против 1000 в третьей. Оперативную память всегда считают в двоичных единицах: планка на 8 ГБ — это 8 гибибайт. Скорость канала связи считают в десятичных битах.

Байты в QR-кодах и штрих-кодах

Стандарт ISO/IEC 18004 работает с данными на уровне байтов. В байтовом режиме каждый символ занимает ровно 8 бит, и по умолчанию спецификация предполагает кодировку ISO 8859-1; на практике генераторы и сканеры давно перешли на UTF-8, при необходимости объявляя её через механизм расширенной интерпретации каналов.

Внутри кода данные нарезаются на кодовые слова длиной 8 бит. Максимальная вместимость самой большой версии 40 при минимальном уровне коррекции составляет 2953 байта, что соответствует 4296 символам в алфавитно-цифровом режиме и 7089 цифрам в цифровом. Русский текст в UTF-8 при этом уложится примерно в 1470 символов.

Байтовая арифметика лежит и в основе коррекции ошибок. Алгоритм Рида — Соломона в QR-кодах оперирует элементами поля Галуа из 256 элементов, то есть ровно байтами, а сложение в этом поле есть побитовое исключающее ИЛИ. Одно повреждённое кодовое слово восстанавливается двумя проверочными байтами независимо от того, испорчен один бит или все восемь. Собрать код с нужным объёмом данных и уровнем избыточности можно в генераторе QR-кодов, где вместимость пересчитывается при вводе.

Частые вопросы

Сколько байт в килобайте?

По стандарту СИ — 1000, по двоичному счёту — 1024, и правильны оба ответа в своём контексте. Чтобы разночтений не было, для 1024 байт введено отдельное название «кибибайт» с обозначением КиБ. Производители накопителей считают по тысяче, операционные системы обычно по 1024, из-за чего заявленная и отображаемая ёмкость диска расходятся примерно на семь процентов.

Чем байт отличается от октета?

Сегодня практически ничем: и то и другое означает восемь бит. Разница историческая и терминологическая. Байт определялся как группа бит под один символ и на старых машинах бывал шести- и девятибитным, а октет по определению всегда содержит ровно восемь бит. Поэтому сетевые стандарты и документы RFC пишут «октет», исключая любую двусмысленность.

Сколько байт занимает русская буква?

Зависит от кодировки. В однобайтовых Windows-1251 и KOI8-R — один байт, в UTF-8 — два, в UTF-16 — два. Поэтому текстовый файл с русским текстом в UTF-8 весит примерно вдвое больше того же файла в Windows-1251, а поле базы данных на 255 символов и поле на 255 байт вмещают разное количество кириллицы.

Почему максимум байта равен 255, а не 256?

Значений действительно 256, но отсчёт начинается с нуля, поэтому диапазон беззнакового байта — от 0 до 255. Если старший бит трактуется как знак, диапазон становится от минус 128 до 127: 128 отрицательных значений, ноль и 127 положительных. Какая интерпретация применяется, определяет тип данных, а сами восемь бит в памяти одинаковы.

Как посчитать, сколько байт займут данные в QR-коде?

Сложите длину полезных данных в выбранном режиме со служебными полями: четыре бита индикатора режима и счётчик длины в 8–16 бит в зависимости от версии. Цифры расходуются по 10 бит на три штуки, латиница в алфавитно-цифровом режиме по 11 бит на два символа, произвольный текст по 8 бит на байт кодировки. К полученному объёму добавляется избыточность выбранного уровня коррекции — от примерно 7 до 30 процентов данных.