Хранение данных в памяти

В памяти компьютера любая информация представлена наборами 0 и 1. Сами биты не сообщают, что перед нами: число, буква, цвет, звук или команда. Смысл появляется только тогда, когда программа применяет известный тип и формат данных.
Зачем это нужно
Компьютер работает с очень разной информацией:
- числами;
- текстом;
- фотографиями;
- звуком;
- видео;
- командами программы;
- сообщениями, передаваемыми по сети.
Физически память не содержит нарисованных букв, картинок или звуковых волн. Она содержит состояния, которые цифровая система представляет битами 0 и 1. Чтобы превратить биты в понятную информацию, программа должна знать правила чтения.
Ошибки формата могут привести к неожиданным результатам:
- число будет прочитано как символ;
- два байта поменяются местами;
- отрицательное значение станет большим положительным;
- часть изображения получит неправильный цвет;
- принимающая программа неверно определит границы сообщения.
Главная идея
набор битов + тип данных + формат = информация с определенным смыслом

Рассмотрим байт:
01000001₂
Его можно интерпретировать по-разному.
| Способ интерпретации | Возможный смысл |
|---|---|
| Беззнаковое целое число | 65₁₀ |
| Код символа в ASCII или UTF-8 | латинская буква A |
| Набор флагов | восемь отдельных состояний |
| Часть цвета или изображения | значение одного канала или фрагмент данных |
| Часть машинной команды | один байт инструкции или параметра |
Компьютер не угадывает правильный вариант. Программа выбирает его по типу данных и правилам формата.
Любая информация в цифровой памяти - это набор 0 и 1. Один и тот же набор можно прочитать по-разному, но программа должна делать это осознанно и одинаково во всех связанных частях системы.
Если записать данные в одном формате, а прочитать в другом, компьютер может получить формально допустимый, но нелогичный для человека результат. В зависимости от языка и способа доступа это приводит к неверным значениям, ошибкам, повреждению данных или нестабильной работе программы. Поэтому нужно избегать случайного смешивания типов, размеров и форматов.
Тип и формат данных
Тип данных описывает, с каким видом значения работает программа. Например:
- целое число;
- дробное число;
- логическое значение;
- символ;
- строка;
- массив.
Формат данных задает более подробные правила:
- сколько бит или байтов занимает значение;
- есть ли знак;
- как записано дробное число;
- в каком порядке расположены байты;
- какая кодировка используется для текста;
- как определить начало и конец сообщения.
Например, слова «целое число» недостаточно. Нужно также знать, занимает оно 1₁₀, 2₁₀, 4₁₀ или 8₁₀ байт, является знаковым или беззнаковым.
Как хранятся целые числа
Чем больше бит выделено, тем больше различных комбинаций можно записать.
| Размер | Количество комбинаций | Беззнаковый диапазон |
|---|---|---|
1₁₀ бит | 2₁₀ | от 0₁₀ до 1₁₀ |
8₁₀ бит, 1₁₀ байт | 256₁₀ | от 0₁₀ до 255₁₀ |
16₁₀ бит, 2₁₀ байта | 65 536₁₀ | от 0₁₀ до 65 535₁₀ |
Если попытаться сохранить 300₁₀ в беззнаковом поле размером один байт, значение не помещается, потому что максимальная комбинация 11111111₂ равна 255₁₀.
В разных языках результат переполнения может обрабатываться по-разному. Поэтому размер и диапазон типа нужно учитывать заранее.
Знаковые и беззнаковые числа
Одни и те же биты могут обозначать разные числа.
Например, последовательность 11111111₂:
- как беззнаковое восьмибитное число означает
255₁₀; - как знаковое восьмибитное число в дополнительном коде означает
-1₁₀.
Сами биты не изменились. Изменилось правило интерпретации.
Если отправитель передает знаковое число, а получатель читает его как беззнаковое, отрицательное значение может превратиться в большое положительное. Это распространенная ошибка при обмене данными между программами и контроллерами.
Как хранятся дробные числа
Дробные числа можно хранить разными способами. Один из распространенных вариантов - формат с плавающей точкой. Часть битов описывает знак, часть - значащие цифры, часть - масштаб числа.
Такой формат позволяет работать с очень маленькими и очень большими значениями, но не все десятичные дроби представляются в нем абсолютно точно. Например, результат компьютерного вычисления с 0,1₁₀ может содержать небольшую погрешность.
Для денежных расчетов, точных счетчиков и некоторых измерений могут использоваться целые числа с заранее выбранной единицей. Например, вместо 12,34 рубля хранится 1234₁₀ копейки.
Как хранятся символы и строки
Символ хранится как числовой код. Кодировка связывает числовые коды с символами.
Например, в ASCII и UTF-8 латинской букве A соответствует код 65₁₀, то есть 01000001₂.
Строка - последовательность символов. В памяти она превращается в последовательность байтов:
строка -> символы -> числовые коды -> байты -> биты
В UTF-8:
- многие латинские символы занимают один байт;
- русская буква обычно занимает два байта;
- некоторые символы занимают три или четыре байта.
Поэтому количество символов и количество байтов в строке не всегда совпадают.
Как хранятся изображения и звук
Изображение
Растровое изображение состоит из пикселей. Цвет пикселя может храниться как несколько чисел, например значения красного, зеленого и синего каналов.
Если каждый канал занимает один байт, цвет может быть записан тремя байтами:
R -> красный канал
G -> зеленый канал
B -> синий канал
Программа также должна знать ширину, высоту, порядок пикселей и другие параметры формата.
Звук
Цифровой звук хранится как последовательность измерений амплитуды. Для правильного воспроизведения нужно знать:
- частоту дискретизации;
- количество каналов;
- размер одного измерения;
- способ кодирования;
- порядок отсчетов.
Один набор байтов без этих правил нельзя правильно превратить в звук.
Массивы, структуры и файлы
Массив хранит несколько однотипных элементов подряд:
12₁₀, 15₁₀, 11₁₀, 14₁₀
Чтобы прочитать массив, программа должна знать тип и количество элементов.
Структура объединяет разные поля:
имя пользователя
возраст
средний балл
активен ли аккаунт
Файл содержит данные по правилам определенного формата. Расширение часто подсказывает предполагаемый формат, но само по себе не изменяет содержимое. Если просто переименовать photo.png в photo.txt, байты изображения не станут текстом.
Текстовый редактор может попытаться открыть изображение как текст. Он прочитает байты по правилам кодировки и покажет случайные символы. Файл не обязательно поврежден - программа просто применила неподходящий способ интерпретации.
Порядок байтов
Многобайтовое число занимает несколько последовательных байтов. Разные системы могут размещать старший и младший байты в разном порядке.
Например, число из двух байтов состоит из частей:
старший байт | младший байт
Если отправитель и получатель используют разный порядок, итоговое число изменится. Поэтому протокол должен явно задавать порядок байтов.
Хранение и передача данных в роботах

Пусть робот отправляет на компьютер сообщение о своем состоянии.
| Поле | Смысл | Возможный формат |
|---|---|---|
distance | расстояние до препятствия | беззнаковое целое число |
battery | заряд батареи | число от 0₁₀ до 100₁₀ |
leftSpeed | скорость левого мотора | знаковое целое число |
rightSpeed | скорость правого мотора | знаковое целое число |
mode | текущий режим | небольшой числовой код |
Отправитель и получатель должны одинаково понимать:
- порядок полей;
- размер каждого поля;
- наличие знака;
- единицы измерения;
- порядок байтов;
- начало и конец пакета.
Если поле leftSpeed записано как знаковое число, а компьютер читает его без знака, команда -20₁₀ может превратиться в большое положительное значение. Для компьютера это будет результат выбранного формата, но для управления роботом - опасная ошибка.
Пакет данных - группа значений, которая хранится или передается как одно сообщение по заранее согласованной структуре.
Что запомнить про хранение данных
| Данные | Что должна знать программа |
|---|---|
| Целое число | размер и наличие знака |
| Дробное число | формат и допустимую погрешность |
| Символ или строка | кодировку и длину |
| Изображение | размеры, порядок пикселей и формат цветов |
| Звук | частоту, каналы и формат отсчетов |
| Массив | тип и количество элементов |
| Структура или пакет | порядок, размеры и смысл полей |
Главный вывод:
одни и те же 0 и 1 могут означать разную информацию
Поэтому записывающая и читающая части программы должны использовать один и тот же формат.
Практика
Задание 1
Для каждого примера укажите, какие дополнительные сведения нужны для правильного чтения данных.
| Данные | Какие правила нужно знать? |
|---|---|
| Последовательность байтов с текстом | |
| Массив температур | |
| Цветное изображение | |
| Многобайтовое целое число |
Задание 2
Байт 01000001₂ прочитан как беззнаковое число и как символ ASCII. Запишите оба результата и объясните, почему они отличаются по смыслу, хотя биты одинаковы.
Задание 3
Составьте пакет данных для мобильного робота из четырех полей. Для каждого поля укажите:
- название;
- смысл;
- тип;
- размер;
- единицу измерения.
Проверьте себя
- В каком виде любая информация хранится в цифровой памяти?
- Почему один набор битов можно интерпретировать по-разному?
- Чем тип данных отличается от формата данных?
- Почему строка из десяти символов не всегда занимает десять байтов?
- Что может произойти при неверном порядке байтов?
- Почему случайное чтение данных другим типом может быть опасным?
- О чем должны договориться отправитель и получатель пакета?
Сначала ответьте без подсказки. Ответ можно считать полным, если вы:
- формулируете основную мысль своими словами;
- называете важные условия, ограничения или меры безопасности;
- для схемы, кода или расчёта показываете ход решения и ожидаемый результат.
Если один из пунктов объяснить не получается, найдите соответствующую главу статьи, перечитайте её и повторите ответ.
Словарь статьи
- Интерпретация данных - применение правил, определяющих смысл набора битов.
- Тип данных - категория значения, например число, символ, строка или массив.
- Формат данных - подробные правила хранения и чтения данных.
- Кодировка - соответствие между символами и числовыми кодами.
- Строка - последовательность символов.
- Массив - последовательность однотипных элементов.
- Структура - набор полей, объединенных в один логический объект.
- Порядок байтов - порядок расположения частей многобайтового значения.
- Пакет данных - сообщение с заранее заданной структурой.
- Переполнение - ситуация, когда значение не помещается в выделенный диапазон.
- Телеметрия - данные о состоянии устройства, передаваемые для наблюдения и анализа.
Связанные темы
- Устройство памяти - где находятся байты и как программа обращается к ним.
- Двоичная система счисления - как читать двоичные числа.
- Математика в двоичной системе счисления - арифметические и битовые операции.
- Сравнение протоколов обмена - как системы согласуют структуру сообщений.
Источники
- Python Documentation. Binary sequence types: https://docs.python.org/3/library/stdtypes.html#binary-sequence-types-bytes-bytearray-memoryview
- Python Documentation. Unicode HOWTO: https://docs.python.org/3/howto/unicode.html
- Arduino Docs. Memory Guide: https://docs.arduino.cc/learn/programming/memory-guide/
- Unicode Consortium. UTF-8: https://www.unicode.org/standard/standard.html