Весь мой канал Old Programmer здесь: Программирование. Тематическое оглавление моего Zen-канала (Old Programmer). А здесь все о программировании на ассемблере.
- Список разделов канала Old Programmer, канала о программировании и программистах
Два урока из серии об ассемблер придется посвятить числам. Материалы частично взяты из моей книги "Ассемблер и дизассемблирование". Рекомендую также заглянуть сюда
- Программирование на языке C. Преобразование числа в строку и обратно (int, long int, long long, int64_t)
Конечно, современные калькуляторы могут легко преобразовать число из одной системы в другую, но программист должен знать основы трех систем счисления: двоичной, десятичной, шестнадцатеричной. Программировать без этих знаний нельзя.
Параграф 1.6.
Десятичная система счисления
Десятичная система счисления знакома нам с детства. Она естественна для нас и освещена вековыми традициями. Двоичная система счисления не привычна для нас, но естественна для компьютера. Память его состоит из элементов, которые могут находиться в двух состояниях. Поэтому логично, что одно состояние принято обозначать как 0, а другое как 1. В результате вся информация в памяти записывается в виде двоичных чисел, т. е. последовательности нулей и единиц. Кроме этого память также делят на блоки по восемь элементов, которые называют ячейками памяти или байтами. Один разряд в двоичной записи числа называют также битом. Таким образом, каждая ячейка памяти будет состоять из восьми двоичных разрядов или восьми битов.
Вспомним, что десятичные числа — это числа по основанию 10, т. е. любое десятичное число может быть представлено в виде суммы по степеням 10, где коэффициентами служат разряды числа. Вот так:
Другими словами каждый разряд дает вклад в зависимости от позиции, которую он занимает. Позиция эта определяется номером справа налево, начиная с нуля. Такие системы счисления называют еще позиционными.
Двоичная система счисления
Двоичная система счисления также является позиционной. Любое двоичное число, таким образом, может быть представлено в виде суммы степеней числа 2:
Данный способ записи двоичного числа является, по сути, и способом перевода его в другую систему счисления. В частности, выполнив действия в десятичной системе счисления, мы получим число 233.
Перевести десятичное число в двоичное представление несколько сложнее. Это делается по следующей схеме:
- Делим число на 2.
- Если результат больше единицы, то возвращаемся к пункту 1.
- Двоичное число составляется из последнего результата деления (старший бит), а также всех остатков от деления.
Рассмотрим перевод в двоичную систему счисления числа 350 (рисунок 1).
В результате представленных выше вычислений можно видеть, что двоичным представлением числа 350 будет 101011110. В ассемблере GAS двоичные числа принята обозначать так 0b101011110 (префикс 0b).
По аналогии с десятичными дробями можно рассматривать двоичные дроби. Например, двоичное число 1001,1101 можно представить как:
Очевидно, что перевод двоичной дроби в десятичную систему счисления производиться также просто выполнением действий. Переведем, например число 1001,1101 в десятичный формат. Для этого выполним все указанные в представлении двоичного числа действия. В результате получаем десятичную дробь 9,8125.
Перевод десятичной дроби в двоичную систему производится также достаточно просто. Целая и дробная части дроби переводятся отдельно. Как переводится целая часть, мы уже знаем. Перевод дробной части осуществляется с помощью следующих шагов:
- Нужно умножить дробную часть на 2 (основание системы).
- В полученном числе необходимо выделить целую часть (это будет либо 0, либо 1) — это и будет первый после запятой разряд в двоичной системе счисления.
- Если дробная часть получившегося числа отлична от нуля, то следует перейти к пункту 1, в противном случае закончить вычисления. Можно установить точность вычисления, т. е. количество полученных после запятой разрядов и прекратить вычисления по достижению этой точности.
Рассмотрим конкретный пример преобразования десятичного числа 105,406 в двоичное представление. Как перевести целую часть числа, мы уже знаем. Таким образом, число 105 в двоичном представлении — это 1101001. Для перевода дробной части воспользуемся описанной схемой. На рисунке 2 представлена последовательность вычислений. Замечу, что мы оказались вынужденными остановиться на девяти знаках после запятой.
В результате наших вычислений получаем, что
Таким образом, перевод десятичных чисел в двоичный формат, в котором они хранятся в памяти компьютера - это дополнительный фактор потери точности.
Шестнадцатеричная система счисления
Шестнадцатеричная система счисления более компактна, чем десятичная система счисления. Числа в шестнадцатеричной системе легко переводятся в двоичную систему и обратно, и, наконец, она лучше всякой другой системы соответствует архитектуре памяти компьютера. Для записи чисел в этой системе счисления используются шестнадцать символов (десять цифр и шесть букв): 0, 1, ..., 9, A, B, C, D, E, F. Способ перевода числа из десятичной системы счисления в шестнадцатеричную систему и обратно аналогичен способу, описанному в предыдущем разделе, с той лишь разницей, что здесь основанием системы счисления является 16, а не 2. Я думаю, что читатель без труда справится с этим вопросом самостоятельно.
Остановимся на переводе чисел из шестнадцатеричной системы в двоичную систему и обратно. Принцип здесь чрезвычайно прост: каждому разряду шестнадцатеричного числа соответствует четыре разряда (тетрада) двоичного и числа и наоборот. На рисунке 3 представлен пример преобразования двоичного числа 10101101 в шестнадцатеричную систему счисления.
На рисунке 4 представлено обратное преобразование шестнадцатеричного числа 0x14A (шестнадцатеричные число имеет в GAS префикс 0x) в двоичное число.
Итак, шестнадцатеричная система счисления хорошо укладывается в архитектуру памяти компьютера. Действительно, память компьютера разбивается на ячейки по восемь битов. Но восемь битов как раз соответствуют двум разрядам в шестнадцатеричной записи числа. Например, очевидно, что число 0x1345 будет занимать две ячейки памяти, причем в младшей ячейке (так принято), т. е. ячейке с меньшим адресом, будет находиться 0x45, а в старшей - 0x13.
В случае дробных чисел перевод из шестнадцатеричной системы счисления в двоичную систему и обратно производится также просто, как это делается с целыми числами. Дробная часть, как и целая, переводится по принципу: один разряд в шестнадцатеричной системе соответствует четырем разрядам двоичной системы. Рассмотрим двоичное дробное число 101,10001 и переведем его в шестнадцатеричную системы счисления. Имеем 101 -> 0101 -> 5. Далее дробная часть 10001 -> 10001000 -> 88 (заметьте, что четверки разрядов в дробной части отсчитываются слева направо). В результате получаем, что число 101.10001 в двоичной системе счисления равно числу 5,88 в шестнадцатеричной системе счисления. Как и в случае целой части, перевод дробной части сводится к выделению четверок и дополнении нулями не полных четверок (но только справа).
--> Глава 1. Параграф 1.7. <--Глава 1. Параграф 1.5.
В ассемблере нет ничего, кроме чисел. Пока! Подписываемся на мой канал Old Programmer.
Я вижу, что вы забыли поставить ЛАЙК, не так ли?