Двоичная система счисления в Pascal. Объем памяти
Создано: 14.04.2026
В этом уроке немного отвлечемся от программирования и коснемся вопроса хранения данных в памяти компьютера. Вычислительная машина — это техническое устройство. На физическом уровне память компьютера состоит из миллионов крошечных переключателей (транзисторов), из которых создают ячейки памяти (триггеры). Транзистор может находиться только в двух состояниях: "включено" (есть ток) или "выключено" (нет тока), а триггер может хранить эти состояния, пока подается питание. Этим состояниям соответствуют цифры 1 и 0.
Отсюда следует, что триггер — это минимальная единица памяти вычислительного устройства, и эта единица может хранить только одно из двух значений: либо 0, либо 1. В информатике такая минимальная единица информации называется битом.
Хотя физически всё хранится в битах (0 или 1), измерять объемы информации в таких мелких единицах неудобно. Одним битом почти ничего нельзя закодировать. Поэтому в качестве основной единицы измерения информации используется байт, состоящий из 8-ми битов. В большинстве современных компьютеров байт — это самая маленькая единица памяти, которая имеет свой собственный адрес. Процессор может обратиться к конкретному байту, но чтобы достать отдельный бит, ему сначала нужно прочитать весь байт целиком.
Если какие-либо данные описываются через что-то значащую закономерность нулей и единиц, значит эти данные хранятся в двоичной системе счисления. Таким образом, в памяти компьютера любые данные хранятся в виде чисел, и эти числа представлены в двоичной системе счисления. Тогда почему они предстают перед нами то в виде десятичных чисел, то в виде текста, то как изображение? Это результат декодирования двоичных данных по определенному алгоритму. Это декодирование в основном выполняет программное обеспечение компьютера на разных уровнях.
Числа в двоичной системе счисления длиннее чем, в десятичной. Так числа 0 и 1 в обеих будут обозначаться одинаково. Но уже числу 2 в десятичной системе будет соответствовать число 10 в двоичной. А числу 9 в десятичной, 1001 в двоичной. В отдельной статье раздела по информатике вы можете узнать, по каким правилам переводятся двоичные числа в десятичные и наоборот. В этом же уроке нас больше интересует объем памяти, который занимают данные.
На данный момент мы знакомы только с тремя типами данных Паскаля — это integer, real и string. В одном из первых уроков было сказано, что под значения каждого из них выделяется разный объем памяти. Чтобы узнать его, достаточно воспользоваться стандартной функцией sizeof языка Pascal:
var i: integer; f: real; s: string; begin writeln(sizeof(i)); // 2 writeln(sizeof(f)); // 8 writeln(sizeof(s)); // 256 i := 15896; f := 1.342415; s := 'Hello World!'; writeln(sizeof(i)); // 2 writeln(sizeof(f)); // 8 writeln(sizeof(s)); // 256 end.
В комментариях показаны числа, которые будут выводиться на экран. Как мы видим, они не меняются после присваивания значений. Это происходит потому, что неважно, что находится в памяти, ведь резервируется ее объем под определенный тип данных. В скобках sizeof можно указывать даже не переменную, а имя типа данных. Например, sizeof(integer). Однако, если sizeof показывает объем памяти, то в каких единицах измерения информации он выражен? Очевидно, в байтах.
Таким образом, под тип integer выделяется 2 байта или 16 бит (это зависит от режима работы компилятора, если в начале кода надо добавить директиву {$mode objfpc}, то будет выделяться 4 байта), под real — 8 байт, под переменную типа string — 256 байтов.
Создайте массив. Посмотрите, сколько памяти он занимает. Объясните результат.
В языке Pascal есть функция binstr, которая позволяет увидеть, как в памяти закодированы целые числа. Вторым параметром в binstr передается количество бит, которые мы хотим отобразить, а не байтов. "Неиспользуемые" слева будут заполнены нулями.
var i: integer; begin i := 15896; writeln(binStr(i, 16)); writeln(binStr(935, 16)); writeln(binStr(2, 8)); end.
0011111000011000 0000001110100111 00000010
В binstr можно передавать только целые значения. Вещественные числа и строки кодируются сложнее, чем буквальным переводом в двоичную систему счисления. Даже с отрицательными целыми не все так просто, хотя binstr все еще может показать, как они выглядят в памяти:
var i: integer; begin i := -15896; writeln(binStr(i, 16)); writeln(binStr(-935, 16)); writeln(binStr(-2, 16)); end.
1100000111101000 1111110001011001 1111111111111110
Для кодирования отрицательных чисел в памяти компьютера используется так называемый дополнительный код числа.
В Паскале есть возможность присваивать переменным числа непосредственно в двоичном представлении. Для этого перед числом надо поставить знак процента. Однако при обычном выводе на экране такие числа отображаются в десятичном виде. Если вы хотите увидеть двоичное число, то опять же необходима функция binstr.
var x: integer; begin x := %1001; writeln(x); // 9 writeln(BinStr(x, 6)); // 001001 end.
Разработайте программу, которая демонстрирует как складываются числа в двоичной системе счисления. Например, даны числа 4 и 3, на экране должны быть в двоичном виде отображены они сами и их сумма.
Задания для дополнительной или самостоятельной работы:
- Напишите программу перевода десятичного числа, которое вводит пользователь, в соответствующее двоичное число, которое отображается на экране.
- Напишите программу перевода двоичного числа, которое вводит пользователь (вводится строка, в которой первой символ — процент, далее идут нули и единицы), в десятичное. Вспомните про функцию
val. - Как, используя функции
lengthиsizeof, можно определить размерность матрицы (количество строк и столбцов).