Найти тему

Как компьютер хранит ваши данные?

Кажется я видел двойку!
Кажется я видел двойку!

Когда вы берете свой телефон в руки, чтобы, например, посмотреть свой баланс на счету в банке, заказать такси или забронировать столик вы сталкиваетесь с самыми разнообразными данными

Это может быть картинка, музыка, текст, число, видео и так далее, иными словами, любая информация, которую можно представить понятным человеку образом и которая может быть ему полезна. Ведь основная задача любой программы и компьютера - это выполнять полезную работу, которая чаще всего заключается в манипуляции данными.

Приложения на вашем телефоне и данные, которыми они оперируют неразрывно связаны между собой, иными словами: одно не имеет смысла без другого.

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

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

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

"Ваш баланс: 13.37 Рублей"

Для примера возьмем баланс на вашей карте, которую вы можете посмотреть в банковском приложении (рекламы не будет=)) на вашем телефоне.

Что из себя представляет баланс? Чаще всего это некое число и строка с валютой, которые интерфейс вашего телефона последовательно склеивает и выводит на экран. Иногда для простоты число, представляющее рубли и копейки заранее преобразуют в строку и склеивают с валютой, чтобы избавить интерфейс от лишней логики.

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

Числа в языках программирования зачастую представлены целочисленными типами (со знаком и без) и типами с плавающей точкой. Почему числа с плавающей точкой так зываются и почему НИКОГДАникогда нельзя хранить денежные суммы в переменных этого типа я обязательно расскажу в будущих публикациях!

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

Вполне допустимо (но не всегда удобно) хранить данные о деньгах в виде целого числа, отражающее количество копеек на балансе. Но как эти данные хранятся в компьютере?

Каждый школьник знает, что любое десятичное число можно представить в двоичном виде: наборе нулей и единиц. Использовать именно двоичное представление для чисел в компьютере: один из фундаментальных принципов построения ЭВМ, которые предложил Джон фон Нейман в 1946 году.

Джон фон Нейман
Джон фон Нейман

Это значительно облегчило техническую реализацию арифметических и логических операций в ЭВМ, которые до этого хранили данные исключительно в десятичном виде.

По мере прогресса ЭВМ научились работать не только с числами, а так же с информацией самой различной природы. Это привело к тому, что многие языки программирования обзавелись системой типов, которая позволяла преобразовывать безликие последовательности нулей и единиц в осмысленные типы, с ограничениями применимости операций к ним. Это позволило структурировать работу с данными на уровне исходного кода программ. 

А что со строками? Строка представляет из себя набор из символов. Существует таблица ASCII в которой каждом числу от 0 до 255 поставлен в соответствие один из 256 символов кодировки. Почему именно 256? Ответ прост: так исторически сложилось, что этих символов хватило для американского стандарта.

Соответственно, компьютер, работая с переменной типа "строка" знает, что для каждого из байт (чисел от 0 до 255) содержащегося в строке, ему, при выводе строки на экран, нужно выбрать из таблицы ASCII соответствующий этому числу символ.

Таблица ASCII
Таблица ASCII

Очень удобно, но 255 это максимальное число, которое можно представить одним байтом, который включает в себя 8 битов (2^8 = 256). Один бит же это 0 или 1. Переведя десятичное число в двоичную разрядность мы получим его битовое представление.

Иными словами, строка - это набор символов, каждый символ - это число от 0 до 255 (в кодировке ASCII), а каждое десятичное число можно представить в двоичном виде.

Следуя схожим принципам мы можем привести к набору нулей и единиц (или битовому представлению) любые данные.

Изображение можно представить набором из пикселей, каждый из которых можно охарактеризовать его координатой на полотне и цветом в кодировке RGB. Цвет, в свою очередь представлен тремя байтами (R: 0-255; G: 0-255; B: 0-255), каждый из которых численно описывает присутствие одного из трех цветов.

Видео можно представить как набор из изображений (кадров) идущих последовательно друг за другом.

Таким образом, мы заключили, что любые данные можно представить набором из нулей и единиц. А теперь спустимся на уровень ниже и подумаем, как мы можем представить нули и единицы на физическом уровне?

Очень просто! Отсутствие или наличие заряда в ячейки памяти мы будем трактовать как
ноль и единицу соответственно, тем самым создавая энергозависимые устройства для хранения данных (RAM или оперативная память, например)

Ставьте лайк, если вам было интересно и подписывайтесь на мой канал! В будущем планирую развивать этот блог и очень надеюсь на вашу поддержку! Всем добра:)