Байты, шестнадцатеричная запись и текст
Буква A хранится как 65, или 01000001. В UTF-8 корейский слог, например U+D55C, занимает три байта.
Сначала бытовая загадка. (Это придуманный пример.) Один ученик пишет в чате слово Korean, шесть букв. Друг пишет то же слово корейским письмом, это три слога. Какое сообщение больше? Скорее всего, не то, что ты думаешь. В UTF-8 шесть английских букв занимают 6 байтов. Три корейских слога занимают 9 байтов, по три на слог. RFC 3629, стандарт, который определяет UTF-8, приводит именно это слово как один из примеров и выписывает его байты: ED 95 9C EA B5 AD EC 96 B4. Разницу объясняют две вещи. Нужен короткий способ записывать байты, и нужна договорённость, которая превращает буквы в числа.
Две шестнадцатеричные цифры на каждый байт
Эти пары букв и цифр являются шестнадцатеричной записью (hex). Длинные ряды нулей и единиц трудно читать, поэтому программисты пользуются этим сокращением. В шестнадцатеричной системе шестнадцать цифр: от 0 до 9, а затем от A до F для чисел от десяти до пятнадцати. Одна шестнадцатеричная цифра покрывает ровно четыре бита, поэтому байт всегда записывается двумя такими цифрами. Раздели 01000001 на 0100 и 0001. Это 4 и 1, значит, байт равен 0x41, где 0x лишь говорит «это шестнадцатеричное число». В десятичной системе это 4 × 16 + 1 = 65.
Скорее всего, ты уже встречал шестнадцатеричные числа, не замечая этого. Цвета на веб-страницах часто записывают как #RRGGBB, по одному байту на красный, зелёный и синий свет (MDN). #FF0000 означает полный красный: 255 в первом байте и 0 в двух других. #FFFFFF означает белый. Наибольший байт, 11111111, равен 0xFF, а 0xFF = 15 × 16 + 15 = 255.
A равна 65, потому что все так договорились
Компьютер понятия не имеет, что такое буква. Он хранит число, а все заранее договариваются, какое число означает какую букву. На ранних сетях использовали договорённость ASCII, и RFC 20 описал её для ARPANET в 1969 году. В ASCII 7 битов, поэтому в нём 128 кодов. Заглавная A имеет код 65, B 66 и так далее до Z с кодом 90. Строчная a имеет код 97. Это ровно на 32 больше, чем у A, то есть разница в один бит. Цифры тоже являются кодами. Символ 0 имеет код 48, поэтому символ «7» хранится как 55, а не как число 7.
Перетащи, чтобы повернуть. Колёсико или щипок для масштаба.
Почему корейскому слогу нужно три байта
128 кодов с избытком хватает для английского и совсем не хватает для корейского, арабского, китайского или эмодзи. Юникод даёт каждому символу письменностей мира собственный номер, кодовую точку, вплоть до U+10FFFF. UTF-8 (RFC 3629) является самым распространённым способом превращать эти номера в байты: от одного до четырёх байтов на символ. 128 символов ASCII сохраняют свои старые однобайтовые коды, поэтому обычный английский текст одинаков в ASCII и UTF-8. Таблица RFC помещает все кодовые точки от U+0800 до U+FFFF в трёхбайтовую строку, а корейские слоги лежат в этом диапазоне. Буква é с ударением занимает два байта, корейский слог, например U+D55C, три, а эмодзи, например 😀, четыре. Первый байт даже сообщает длину. ED равно 11101101, и три цифры 1 в начале говорят, что этот символ занимает три байта.
| Символ | Кодовая точка | Байты UTF-8 (hex) | Байты |
|---|---|---|---|
| A | U+0041 | 41 | 1 |
| a | U+0061 | 61 | 1 |
| é | U+00E9 | C3 A9 | 2 |
| Корейский слог (U+D55C) | U+D55C | ED 95 9C | 3 |
| 😀 | U+1F600 | F0 9F 98 80 | 4 |
Кракозябры являются правильными байтами, прочитанными по неправильной договорённости
Простой текстовый файл состоит из этих байтов подряд и больше ничего. Слово Hello в UTF-8 занимает пять байтов: 48 65 6C 6C 6F в шестнадцатеричной записи, или 72, 101, 108, 108, 111 в десятичной. Две буквы l являются одним и тем же байтом дважды. Теперь открой этот файл или файл на корейском с неправильной договорённостью, скажем со старой корейской или японской кодировкой вместо UTF-8. Программа прочитает те же самые байты как другие символы. В файле ничего не сломано, и если снова открыть его как UTF-8, текст вернётся.
Куда делись пропавшие 34 ГБ
Поскольку 2 в степени 10 равно 1024, что близко к 1000, люди долго называли «килобайтом» и то, и другое. В декабре 1998 года IEC утвердила отдельные названия, и NIST их перечисляет: 1 kB равен 1000 байтов, а 1 KiB, кибибайт, равен 1024 байтам; 1 MB равен 1 000 000 байтов, а 1 MiB равен 1 048 576 байтам. Производители дисков считают в степенях десяти. Диск, проданный как 500 ГБ, вмещает 500 000 000 000 байтов. Операционная система, которая считает в степенях двойки, делит на 1 073 741 824 и показывает примерно 465.66 GiB. Примерно 34, которые будто бы пропали, никогда и не существовали. Два числа просто выражены в разных единицах. Разрыв растёт вместе с единицей: KiB на 2.4% больше kB, GiB примерно на 7.4% больше GB.
- «1 КБ везде равен ровно 1000 байтов». По стандарту kB означает 1000 байтов, а 1024 байта являются KiB. На практике старые названия всё ещё используют в обоих смыслах. NIST отмечает, что производители памяти под мегабайтом обычно понимают 2²⁰ байтов, а производители накопителей 1 000 000, а старая дискета «1.44 МБ» использовала третий мегабайт, в 1 024 000 байтов. Когда важен точный размер, ищи букву i: KiB, MiB, GiB.
- «Мой диск на 500 ГБ пришёл без 34 ГБ». 500 000 000 000 байтов ÷ 1 073 741 824 ≈ 465.66 GiB. Те же байты, другая единица. 500 − 465.66 ≈ 34.34, и этот разрыв и есть «пропавшие» 34.
- «Один символ всегда занимает один байт». В UTF-8 это верно только для 128 символов ASCII. é занимает 2 байта, корейский слог 3, а 😀 4, поэтому лимит, считаемый в байтах, заполняется корейским текстом примерно в три раза быстрее, чем английским.
- «Символ 7 хранится как число 7». Символ «7» имеет код 55, или 00110111. Программа, которая читает «7» из текста, должна превратить его в число 7, прежде чем считать с ним.
- Чему равно 0x41 в десятичной системе?
- Чему равно 0xFF в десятичной системе?
- Сколько битов обозначает одна шестнадцатеричная цифра?
- В ASCII A имеет код 65. Какой код у C?
- На сколько код a больше кода A?
- Сколько кодов в 7-битном ASCII?
- Сколько байтов занимает корейский слог U+D55C в UTF-8?
- Какой символ хранится как 01000010?
- B
- A
- b
- 2
- Сколько байтов в 1 MiB?
- Диск вмещает 500 000 000 000 байтов. Сколько это примерно GiB? (один знак после точки)
- Одна шестнадцатеричная цифра = 4 бита; байт = две шестнадцатеричные цифры (от 0x00 до 0xFF).
- ASCII: A = 65, a = 97, 0 = 48; 128 кодов в 7 битах.
- UTF-8 использует от 1 до 4 байтов на символ; текст ASCII не меняется.
- 1 kB = 1000 B, 1 KiB = 1024 B; 1 MiB = 1 048 576 B.
Источники курса (9)
- (checked 2026-10-17; reordered 2026-10-19: standards first, then official documentation, then the teaching model and calculations, history sources last)
- Standards: NIST, "Prefixes for binary multiples" (physics.nist.gov/cuu/Units/binary.html: IEC approved kibi, mebi, gibi in December 1998; 1 B = 8 bit; 1 MiB = 1 048 576 B; 1 MB = 1 000 000 B; 1 GiB = 1 073 741 824 B; historical note: memory makers usually mean 2²⁰ bytes by megabyte, storage makers 1 000 000, and the "1.44 MB" diskette uses a megabyte of 1 024 000 bytes)
- IETF RFC 20 "ASCII format for Network Interchange" (1969, 7-bit codes, A = 65, a = 97, 0 = 48)
- IETF RFC 3629 "UTF-8, a transformation format of ISO 10646" (2003: 1 to 4 octets per character, ASCII unchanged, code points up to U+10FFFF, U+0800 to U+FFFF take three octets, "the first octet of a multi-octet sequence indicates the number of octets", example U+D55C U+AD6D U+C5B4 = ED 95 9C EA B5 AD EC 96 B4)
- Official documentation: MDN Web Docs, "<color>" (hexadecimal colour notation #RRGGBB)
- Intel, "Intel Chips" timeline poster (2012: Intel 4004 of 1971 with 2,300 transistors; 2nd generation Core 2010 with 1.16 billion)
- Claude E. Shannon, "A Symbolic Analysis of Relay and Switching Circuits", Transactions of the AIEE vol. 57 (1938)
- abstract of his MIT master's thesis. Computer History Museum, The Silicon Engine, "1947: Invention of the Point-Contact Transistor" (Bardeen and Brattain, December 1947, germanium)
- John von Neumann, "First Draft of a Report on the EDVAC" (30 June 1945, Moore School, reprinted in IEEE Annals of the History of Computing 15:4, 1993).
Проверено: 2026-10-17