Системы счисления: Математическая основа компьютерной архитектуры
Система счисления — это символический метод записи чисел, представление чисел с помощью письменных знаков (цифр). Хотя в повседневной жизни человечество использует десятичную систему (вероятно, из-за количества пальцев на руках), для дискретной математики и проектирования вычислительной техники эта система оказалась неэффективной. Понимание различных позиционных систем счисления — фундамент для работы с архитектурой ЭВМ и низкоуровневым программированием.
Все системы счисления делятся на непозиционные (где вес цифры не зависит от ее позиции, как в римских цифрах) и позиционные. В позиционных системах значение каждого знака умножается на основание системы в степени, соответствующей позиции знака. В информатике абсолютно доминируют системы с основаниями, являющимися степенями двойки.
Двоичная система (Binary, основание 2) использует только цифры 0 и 1. Это идеальная математическая модель для электронных схем: есть напряжение (1) или нет напряжения (0), транзистор открыт или закрыт. Каждый разряд в этой системе несет минимально возможное количество информации — один бит. Перевод из двоичной системы в десятичную осуществляется суммированием степеней двойки, соответствующих позициям единиц.
Работать с длинными строками из нулей и единиц человеку сложно, поэтому программисты используют более компактные представления:
- Восьмеричная система (Octal, основание 8): исторически использовалась в старых компьютерах. Каждые три бита (триада) двоичного числа точно соответствуют одной восьмеричной цифре (от 0 до 7). Сегодня она часто применяется в Unix-подобных системах для задания прав доступа к файлам (например, chmod 777).
- Шестнадцатеричная система (Hexadecimal, основание 16): стандарт де-факто в современном IT. Использует цифры от 0 до 9 и буквы от A до F (где A=10, F=15). Ровно четыре бита (тетрада) образуют одну шестнадцатеричную цифру. Два шестнадцатеричных знака идеально кодируют ровно один байт (8 бит), что делает эту систему незаменимой для чтения дампов памяти, задания цветов в веб-дизайне (например, #FF0000) и представления IPv6-адресов.
Особого внимания заслуживает машинная арифметика. Как процессору вычесть одно число из другого, если он умеет только складывать? Для этого в дискретной математике используется дополнительный код (Two's complement). Для представления отрицательного числа все биты положительного числа инвертируются (прямой код становится обратным), а затем к младшему разряду прибавляется единица. Это гениальное математическое решение позволяет процессору складывать положительные и отрицательные числа с помощью одного и того же аппаратного сумматора, аппаратно игнорируя переполнение старшего бита.