Хакерский редактор Hacker Viewer (Hiew) .
Для визуального восприятия шестнадцатеричного кода воспользуемся замечательным простым, но достаточно функциональным DOS редактором Hacker Viewer (Hiew). Вы найдёте его в папке D:\UTILS\HIEW\ (я надеюсь, что наш архив программ DOS-1.rar уже скачан и DOSBox установлен и запущен).
Запускаем HIEW (Hacker Viewer).
Инструкцию по пользованию Hiew для хакеров от Криса Касперского вы найдёте в папочке readme. Пользоваться редактором просто и удобно.
Откроем с помощью Hiew нашу программу PRG.COM (выбор файлов — F9). При помощи F4 выбираем режим отображения информации HEX (как вы уже знаете, шестнадцатеричный режим). Можете с помощью F4 или Enter по переключаться между режимами отображения.
Переключение режимов отображения в Hacker Viewer.
Обратите внимание на положение Decode (декодирование). Вам это ни о чём не говорит? Да, да, да в Hiew имеется встроенный дизассемблер и даже ассемблер! Можно внести изменения в ассемблерный код, не выходя из редактора и сохранить изменения. Исполняемый файл останется рабочим — гениальная программа с поразительными возможностями для своего времени!
Исполняемый файл останется рабочим — гениальная программа с поразительными возможностями для своего времени!
Подобное отображение HEX системы счисления вы увидите практически во всех отладочных программах и просмотрщиках файлов. Перемещайте курсор с помощью клавиш стрелок на клавиатуре. Вверху вы заметите изменение цифры указателя (pointer).
Наша первая программа в шестнадцатеричном виде.
Указатель является одним из основополагающих понятий в системе программирования. Основы понимания работы с указателем рассмотрим попозже.
Перевод десятичных чисел в шестнадцатеричную форму
Перевод десятичного числа в шестнадцатеричную форму выполняется делением исходного числа на 16.
Например, переведем 300 в шестнадцатеричную форму:
_300 |16 То же самое можно записать иначе: 16 _18 |16 300 / 16 = 18 остаток 12 => C _140 16 1 -> 1 18 / 16 = 1 остаток 2 => 2 128 2 ----> 2 => 12Ch 1 / 16 = 0 остаток 1 => 1 12 --------> C 300 = 12Ch
Примеры перевода чисел 1000 и 60000 в шестнадцатеричную форму:
60000/16 = 3750 остаток 0 => 0 1000/16 = 62 остаток 8 => 8 3750/16 = 234 остаток 6 => 6 62/16 = 3 остаток 14 => E 234/16 = 14 остаток 10 => A 3/16 = 0 остаток 3 => 3 14/16 = 0 остаток 14 => E 1000 = 3E8h 60000 = EA60h
Переведите следующие числа в шестнадцатеричную форму:
945, 138, 1100, 885, 230, 256, 1024
Шестнадцатеричный результат переведите обратно в десятичную форму — это позволит проверить корректность ваших действий.
Перевод чисел из десятичной системы счисления в другую систему счисления
Для перевода чисел из десятичной системы счисления в другую систему счисления нужно переводить отдельно целую часть числа и дробную часть числа.
Целую часть числа переводится из десятичной СС в другую систему счисления — последовательным делением целой части числа на основание системы счисления (для двоичной СС — на 2, для 8-ичной СС — на 8, для 16-ичной — на 16 и т.д.) до получения целого остатка, меньше, чем основание СС.
Пример 4. Переведем число 159 из десятичной СС в двоичную СС:
159 | 2 | ||||||
158 | 79 | 2 | |||||
1 | 78 | 39 | 2 | ||||
1 | 38 | 19 | 2 | ||||
1 | 18 | 9 | 2 | ||||
1 | 8 | 4 | 2 | ||||
1 | 4 | 2 | 2 | ||||
2 | 1 |
Рис. 1
Как видно из Рис. 1, число 159 при делении на 2 дает частное 79 и остаток 1. Далее число 79 при делении на 2 дает частное 39 и остаток 1 и т.д. В результате построив число из остатков деления (справа налево) получим число в двоичной СС: 10011111. Следовательно можно записать:
Пример 5. Переведем число 615 из десятичной СС в восьмеричную СС.
615 | 8 | ||
608 | 76 | 8 | |
7 | 72 | 9 | 8 |
4 | 8 | 1 | |
1 |
Рис. 2
При приведении числа из десятичной СС в восьмеричную СС, нужно последовательно делить число на 8, пока не получится целый остаток меньшее, чем 8. В результате построив число из остатков деления (справа налево) получим число в восьмеричной СС: 1147(см. Рис. 2). Следовательно можно записать:
Пример 6. Переведем число 19673 из десятичной системы счисления в шестнадцатеричную СС.
19673 | 16 | ||
19664 | 1229 | 16 | |
9 | 1216 | 76 | 16 |
13 | 64 | 4 | |
12 |
Рис. 3
Как видно из рисунка Рис.3, последовательным делением числа 19673 на 16 получили остатки 4, 12, 13, 9. В шестнадцатеричной системе счисления числе 12 соответствует С, числе 13 — D. Следовательно наше шестнадцатеричное число — это 4CD9.
Далее рассмотрим перевод правильных десятичных дробей в двоичную СС, в восьмеричную СС, в шестнадцатеричную СС и т.д.
Для перевода правильных десятичных дробей (вещественное число с нулевой целой частью) в систему счисления с основанием s необходимо данное число последовательно умножить на s до тех пор, пока в дробной части не получится чистый нуль, или же не получим требуемое количество разрядов. Если при умножении получится число с целой частью, отличное от нуля, то эту целую часть не учитывать (они последовательно зачисливаются в результат).
Рассмотрим вышеизложенное на примерах.
Пример 7. Переведем число 0.214 из десятичной системы счисления в двоичную СС.
0.214 | ||
x | 2 | |
0.428 | ||
x | 2 | |
0.856 | ||
x | 2 | |
1 | 0.712 | |
x | 2 | |
1 | 0.424 | |
x | 2 | |
0.848 | ||
x | 2 | |
1 | 0.696 | |
x | 2 | |
1 | 0.392 |
Рис. 4
Как видно из Рис.4, число 0.214 последовательно умножается на 2. Если в результате умножения получится число с целой частью, отличное от нуля, то целая часть записывается отдельно (слева от числа), а число записывается с нулевой целой частью. Если же при умножении получиться число с нулевой целой частью, то слева от нее записывается нуль. Процесс умножения продолжается до тех пор, пока в дробной части не получится чистый нуль или же не получим требуемое количество разрядов. Записывая жирные числа (Рис.4) сверху вниз получим требуемое число в двоичной системе счисления: 0.0011011.
Следовательно можно записать:
Пример 8. Переведем число 0.125 из десятичной системы счисления в двоичную СС.
0.125 | ||
x | 2 | |
0.25 | ||
x | 2 | |
0.5 | ||
x | 2 | |
1 | 0.0 |
Рис. 5
Для приведения числа 0.125 из десятичной СС в двоичную, данное число последовательно умножается на 2. В третьем этапе получилось 0. Следовательно, получился следующий результат:
Пример 9. Переведем число 0.214 из десятичной системы счисления в шестнадцатеричную СС.
0.214 | ||
x | 16 | |
3 | 0.424 | |
x | 16 | |
6 | 0.784 | |
x | 16 | |
12 | 0.544 | |
x | 16 | |
8 | 0.704 | |
x | 16 | |
11 | 0.264 | |
x | 16 | |
4 | 0.224 |
Рис. 6
Следуя примерам 4 и 5 получаем числа 3, 6, 12, 8, 11, 4. Но в шестнадцатеричной СС числам 12 и 11 соответствуют числа C и B. Следовательно имеем:
Пример 10. Переведем число 0.512 из десятичной системы счисления в восьмеричную СС.
0.512 | ||
x | 8 | |
4 | 0.096 | |
x | 8 | |
0.768 | ||
x | 8 | |
6 | 0.144 | |
x | 8 | |
1 | 0.152 | |
x | 8 | |
1 | 0.216 | |
x | 8 | |
1 | 0.728 |
Рис. 7
Получили:
Пример 11. Переведем число 159.125 из десятичной системы счисления в двоичную СС. Для этого переведем отдельно целую часть числа (Пример 4) и дробную часть числа (Пример 8). Далее объединяя эти результаты получим:
Пример 12. Переведем число 19673.214 из десятичной системы счисления в шестнадцатеричную СС. Для этого переведем отдельно целую часть числа (Пример 6) и дробную часть числа (Пример 9). Далее объединяя эти результаты получим:
Классификация систем счисления
Системы счисления подразделяются на позиционные и непозиционные.
Позиционные системы счисления
Позиционные системы счисления (СС) — это системы счисления, в которых количественный эквивалент каждой цифры (её вес) зависит от ее положения (позиции) в записи числа. Путем долгого развития человечество пришло к созданию позиционного принципа записи чисел, который состоит в том, что каждая цифра, содержащаяся в записи числа, занимает определенное место, называемое разрядом. Отсчет разрядов производится справа налево. Единица каждого следующего разряда всегда превосходит единицу предыдущего разряда в определенное число раз. Это отношение носит название основание системы счисления (у непозиционных систем счисления понятия «разряда» и «основания» отсутствуют).Например:число 237 состоит из 3 цифр. Понятно, что отдельно взятая цифра 7 больше чем цифра 2. Однако, в составе числа, двойка стоит на позиции сотен, а семёрка — на позиции единиц, поэтому количественное представление двойки — две сотни, или двести, а семёрка — всё та же семь.Многие, кроме десятичной СС, о других позиционных системах не имеют представления, хотя и часто ими пользуются. Например:
- шестидесятиричная (Древний Вавилон) — первая позиционная система счисления. До сих пор при измерении времени используется основание равное 60 (1 мин = 60 с, 1 ч = 60 мин);
- двенадцатеричная система счисления (широкое распространение получила в XIX в. Число12 — «дюжина»: в сутках две дюжины часов. Счет не по пальцам. а по суставам пальцев. На каждом пальце руки, кроме большого, по 3 сустава — всего 12;
В настоящее время наиболее распространенными позиционными системами счисления являются десятичная, двоичная, восьмеричная и шестнадцатеричная.Общее свойство всех позиционных систем счисления: при каждом переходе влево (вправо) в записи числа на один разряд величина цифры увеличивается (уменьшается) во столько раз, чему равно основание системы счисления.Достоинства позиционных систем счисления:
- в позиционных системах счисления устранены все недостатки непозиционных:
- в них можно записать любое число (как натуральное, таки действительное);
- запись чисел компактна и удобна;
- благодаря поразрядной организации записи чисел с ними легко проводить математические операции.
Непозиционные системы счисления
В непозиционных системах счисления величина, которую обозначает цифра, не зависит от положения в числе. Например: Римская система счисления.Из многочисленных представителей этой группы в настоящее время сохранила свое значение лишь римская система счисления, где для обозначения цифр используются латинские буквы:
I | V | X | L | С | D | М |
1 | 5 | 10 | 50 | 100 | 500 | 1000 |
С их помощью можно записывать натуральные числа. Например, число 1995 будет представлено, как MCMXCV (М-1000,СМ-900,ХС-90 и V-5).Правила записи чисел в римской системе счисления:
- если большая цифра стоит перед меньшей, они складываются, например: VI – 6 (5+1);
- если меньшая цифра стоит перед большей, то из большей вычитается меньшая, причем в этом случае меньшая цифра уже повторяться не может, например: XL — 40 (50-10), XXL – нельзя;
- цифры М, С, Х, I могут повторяться в записи числа не более трех раз подряд;
- цифры D, L, V могут использоваться в записи числа только по одному разу.
Например, запись XXX обозначает число 30, состоящее из трех цифр X, каждая из которых, независимо от места ее положения в записи числа, равна 10. Запись MCXX1V обозначает 1124, а самое большое число, которое можно записать в этой системе счисления, это число MMMCMXCIX (3999). Для записи еще больших чисел пришлось бы вводить все новые обозначения. По этой причине, а также по причине отсутствия цифры ноль, римская система счисления не годится для записи действительных чисел.Таким образом, можно констатировать следующие основные недостатки непозиционных систем счисления:
- в них нельзя записать любое число;
- запись чисел обычно громоздка и неудобна;
- математические операции над ними крайне затруднены.
Перевод из двоично-десятичной системы в десятичную и обратно
Для этого необходимо разбить двоичное число на группы по 4 символа, предварительно дописав с левой стороны необходимое количество нулей, что бы общее количество символов стало кратно 4. Далее переводим каждую группу в десятичное значение и полученные результаты записываем в соответствующем порядке. Для упрощения задачи можно воспользоваться таблицей соответствия двоичного и десятичного значений.
значение2 | значение10 |
---|---|
0000 | |
0001 | 1 |
0010 | 2 |
0011 | 3 |
0100 | 4 |
0101 | 5 |
0110 | 6 |
0111 | 7 |
1000 | 8 |
1001 | 9 |
Пример. Переведем число 111100100110001 из двоично-десятичной системы в десятичную. Для начала допишем недостающий ноль с левой стороны и разделим по 4 символа: 0111 1001 0011 0001. Далее находим соответствующие десятичные значения в таблице и получаем: 7931.
Для обратного перевода необходимо произвести все действия в обратном порядке, то есть каждой цифре десятичного значения находим по таблице соответствующее двоичное значение и записываем полученные результаты в таком же порядке, как и цифры десятичного числа.
Пример. Десятичное число 1234 переведем в двоично-десятичную. Находим по таблице все соответствия: символу 1 соответствует 0001, символу 2 — 0010, символу 3 — 0011 и символу 4 — 0100. В результате получаем: 0001001000110100.
Единственность представления чисел в P-ичных системах счисления
Если одно и то же целое число можно представить в P-ичной системе счисления несколькими способами, это не кажется слишком удобным. Однако, сделать этого нельзя. Покажем это.
- Теорема о единственности представления чисел в P-ичной системе счисления
- Пусть \(P\in \mathbb{N}\) и \(P>1\). Тогда \(\forall X \in \mathbb{N},\, \exists!\) представление вида \ причем \(a_n\neq 0\), \(0\leq a_i < P\)
- Доказательство
-
Сначала докажем существование по методу индукции.
-
Базис индукции. Существует представление \(1 = 1\).
-
Предположение индукции. Пусть существует представление \(X = \sum_{i=0}^n a_i P^i,\) удовлетворяющее условиям теоремы.
-
Докажем, что существует представление \(X + 1 = \sum_{i=0}^m b_i P^i,\) которое так же удовлетворяет условиям теоремы.
По предположению индукции, \
Тогда \
Рассмотрим случай \(a_0 < P-1\). Тогда \ По методу неопределенных коэффициентов, \(b_0 = a_0+1\), \(b_i = a_i\), \(0 \leq b_i < P\), \(m=n\), \(a_n\neq 0 \Rightarrow b_m\neq 0\).
Рассмотрим случай \(a_0 = P-1\). Тогда \ \ По методу неопределенных коэффициентов, \(b_0 = 0\).
Рассмотрим случай, когда \(a_1<P-1\). Тогда, по аналогии, \(b_1 = a_1+1\), \(b_i = a_i\), \(0 \leq b_i < P\), \(m=n\), \(a_n\neq 0 \Rightarrow b_m\neq 0\).
Иначе, если \(a_1 = P-1\), то \ \
По методу неопределенных коэффициентов, \(b_1 = 0\).
Рассуждая далее по аналогии, либо \(\exists k\leq n: a_k<P-1, \forall i<k:\: a_i=P-1\), либо \(\forall i\in,\, a_i=P-1\).
В первом случае имеем: \ и по методу неопределенных коэффициентов, \(\forall i\in :\: b_i = 0;\) \(b_k = a_k+1;\) \(\forall i\in : b_i = a_i;\) \(m=n\) – удовлетворяет условиям теоремы.
Во втором случае \ \ По методу неопределенных коэффициентов, \(\forall i\in:\:b_i=0;\) \(b_m=1;\) \(m=n+1\).
Существование доказано.
Докажем единственность от противного.
Предположим, что существует два представления \ \ \
Для начала покажем, что, если \(m>n\), то \(X_2 > X_1\). Для этого оценим \(X_2\) снизу наименьшим возможным числом: \(b_m=1\), \(b_{i\neq m} = 0\). С другой стороны, оценим \(X_1\) сверху наибольшим возможным числом: \(a_i = P-1\). Получим:
\ \
По формуле первых n членов геометрической прогрессии, \
\ Тогда \
Если \(m>n\), то \(P^m \geq P^{n+1}\), и, следовательно, \(X_2 > X_1\), что противоречит предположению \(X_2 = X_1\). Следовательно, \(m=n\).
Пусть теперь \(\exists k: \forall i\in ,\, a_i=b_i, a_k\neq b_k\). Оценим разность \(X_1 — X_2\) по модулю снизу.
\
Пусть \(|a_k-b_k| = 1\) (минимально), а \(|a_{i<k}-b_{i<k}| = P-1\) (максимально). Тогда
\ \
Получаем, что \(| X_1 — X_2 | \geq 1,\) следовательно, \(X_1 \neq X_2\). Мы пришли к противоречию, следовательно, \(\forall i: a_i = b_i\), и, значит, представления \(X_1\) и \(X_2\) эквивалентны. \(\blacksquare\)
-
В теории чисел так же доказывается другая теорема: любое неотрицательное вещественное число можно представить (не обязательно единственным образом) в виде \
Пример неоднозначного представления вещественных чисел можно привести, используя десятичные периодические дроби: \(0,1(9) = 0,2\). Можете доказать это утверждение самостоятельно (подсказка: использовать разложение в степенной ряд и формулу суммы бесконечно убывающей геометрической прогрессии)
Числа, представление которых содержит отрицательные степени основания системы счисления \(P\) будем называть P-ичными дробями.
Перевод целых и дробных чисел из одной системы счисления в любую другую − теория, примеры и решения
Существуют позиционные и не позиционные системы счисления. Арабская система счисления, которым мы пользуемся в повседневной жизни, является позиционной, а римская − нет. В позиционных системах счисления позиция числа однозначно определяет величину числа. Рассмотрим это на примере числа 6372 в десятичном системе счисления. Пронумеруем это число справа налево начиная с нуля:
число | 6 | 3 | 7 | 2 |
позиция | 3 | 2 | 1 |
Тогда число 6372 можно представить в следующем виде:
Число 10 определяет систему счисления (в данном случае это 10). В качестве степеней взяты значения позиции данного числа.
Рассмотрим вещественное десятичное число 1287.923. Пронумеруем его начиная с нуля позиции числа от десятичной точки влево и вправо:
число | 1 | 2 | 8 | 7 | . | 9 | 2 | 3 |
позиция | 3 | 2 | 1 | -1 | -2 | -3 |
Тогда число 1287.923 можно представить в виде:
В общем случае формулу можно представить в следующем виде:
Цn·sn+Цn-1·sn-1+…+Ц1·s1+Ц·s+Д-1·s-1+Д-2·s-2+…+Д-k·s-k
где Цn-целое число в позиции n, Д-k— дробное число в позиции (-k), s — система счисления.
Несколько слов о системах счисления.Число в десятичной системе счисления состоит из множества цифр {0,1,2,3,4,5,6,7,8,9}, в восьмеричной системе счисления — из множества цифр {0,1,2,3,4,5,6,7}, в двоичной системе счисления — из множества цифр {0,1}, в шестнадцатеричной системе счисления — из множества цифр {0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F}, где A,B,C,D,E,F соответствуют числам 10,11,12,13,14,15.
В таблице Таб.1 представлены числа в разных системах счисления.
Таблица 1 | |||
---|---|---|---|
Система счисления | |||
10 | 2 | 8 | 16 |
1 | 1 | 1 | 1 |
2 | 10 | 2 | 2 |
3 | 11 | 3 | 3 |
4 | 100 | 4 | 4 |
5 | 101 | 5 | 5 |
6 | 110 | 6 | 6 |
7 | 111 | 7 | 7 |
8 | 1000 | 10 | 8 |
9 | 1001 | 11 | 9 |
10 | 1010 | 12 | A |
11 | 1011 | 13 | B |
12 | 1100 | 14 | C |
13 | 1101 | 15 | D |
14 | 1110 | 16 | E |
15 | 1111 | 17 | F |
Виды систем счисления
Существует несколько различных систем счисления, которые используются для представления чисел и информации в компьютерной науке:
- Десятичная система счисления — наиболее распространенная система счисления, которую мы используем в повседневной жизни. Она основана на числах от 0 до 9 и использует позиционную нотацию, где каждая позиция числа имеет определенное значение в зависимости от ее положения.
- Двоичная система счисления — основная система счисления в компьютерной науке. Она использует только две цифры — 0 и 1 — и основана на системе двоичной арифметики. Двоичные числа обычно представляются с помощью комбинаций нулей и единиц, называемых битами.
- Шестнадцатеричная система счисления — система счисления, которая использует 16 цифр: от 0 до 9 и от A до F. Она используется в компьютерных системах для более удобного представления двоичных значений. В шестнадцатеричной системе каждая цифра соответствует 4-м битам двоичной системы.
- Восьмеричная система счисления — система счисления, которая использует 8 цифр: от 0 до 7. Она редко используется в компьютерной науке, но иногда встречается в некоторых программных языках или системах счисления для более компактного представления чисел.
Эти различные системы счисления имеют разные особенности и применяются в разных областях компьютерной науки, в зависимости от их удобства и эффективности для конкретных задач.
Десятичная система счисления
Каждая позиция числа в десятичной системе имеет значение, увеличивающееся в 10 раз по сравнению с предыдущей позицией. Например, число 1234 в десятичной системе может быть записано как 1 * 10^3 + 2 * 10^2 + 3 * 10^1 + 4 * 10^0.
Десятичная система счисления широко используется в нашей повседневной жизни для представления различных величин: времени, денежных сумм, количества предметов и т.д. Она также широко применяется в программировании и математике.
Двоичная система счисления
Двоичная система счисления имеет свою особенность, которую называют единственной или двоичной логикой. В двоичной системе числа записываются в виде последовательности битов (binary digit – двоичная цифра). Каждый бит может иметь только два значения: 0 или 1.
Двоичная система счисления широко применяется в информатике и компьютерных науках. В компьютерах и других цифровых устройствах информация обрабатывается в двоичной форме, так как она основана на работе электрических сигналов, которые могут быть либо высокими (1), либо низкими (0) напряжениями.
В двоичной системе счисления каждая цифра имеет свой вес, который определяет значение этой цифры. Начиная с младшего разряда, каждый следующий бит умножается на степень двойки. Например, в двоичном числе 101010, первый бит (справа) имеет вес 2^0 (1), второй бит – вес 2^1 (2), третий бит – вес 2^2 (4), и так далее.
Двоичная система счисления также позволяет легко производить операции с числами, такие как сложение, вычитание, умножение и деление. Для этого используется особый алгоритм, который основывается на двоичной логике.
Изучение двоичной системы счисления является важной основой для понимания работы компьютеров и программирования. Поэтому, понимание ее принципов и особенностей является необходимым для любого, кто интересуется информатикой и программированием
Шестнадцатеричная система счисления
В шестнадцатеричной системе счисления каждый разряд числа имеет вес, равный степени 16. Начиная с младших разрядов, каждому разряду соответствует своя весовая степень — от младшего к старшему разряду это 160, 161, 162 и так далее. Это позволяет компактно и удобно представлять большие числа в системе счисления, основанной на степени 16.
Шестнадцатеричная система счисления широко используется в информатике и программировании. Она представляет удобный способ записи и передачи чисел в компьютерных системах, так как каждая шестнадцатеричная цифра может быть легко представлена четырьмя двоичными разрядами.
В шестнадцатеричной системе обычно используются буквы A, B, C, D, E и F для представления чисел, которые больше 9. Например, число 10 записывается как A, число 15 — как F, и так далее.
Шестнадцатеричная система счисления часто применяется при работе с цветами в графическом дизайне и веб-разработке. Например, цвета в формате RGB (красный, зеленый, синий) часто записываются в шестнадцатеричной системе, где каждая компонента цвета представлена двумя шестнадцатеричными цифрами (от 00 до FF).
В информатике важно понимать основы и принципы работы различных систем счисления, так как они широко используются при работе с числами и данными в компьютерных системах
Перевод из десятичной в двоичную, восьмеричную и шестнадцатеричную системы
Для того что бы перевести из десятичной системы в любую другую необходимо последовательно делить число на основание той системы в которую переводим до тех пор пока частное от деления не станет равным нулю. Далее записываем остатки от делений в обратном порядке. Полученная последовательность будет являться результатом перевода в выбранную систему счисления. Для понимания указанных действий разберем последовательное преобразование для каждой из систем.
Из десятичной в двоичную. Исходное число 230, основание системы «2». Производим последовательное деление:
- 230 ÷ 2 = 115 (в остатке );
- 115 ÷ 2 = 57 (в остатке 1);
- 57 ÷ 2 = 28 (в остатке 1);
- 28 ÷ 2 = 14 (в остатке );
- 14 ÷ 2 = 7 (в остатке );
- 7 ÷ 2 = 3 (в остатке 1);
- 3 ÷ 2 = 1 (в остатке 1);
- 1 ÷ 2 = 0 (в остатке 1).
Записываем остатки от деления на 2 в обратном порядке и получаем следующую последовательность: 11100110. Полученный результат является двоичным представлением числа 230.
Из десятичной в восьмеричную. Исходное число 789, основание системы «8». Производим последовательное деление:
- 789 ÷ 8 = 98 (в остатке 5);
- 98 ÷ 8 = 12 (в остатке 2);
- 12 ÷ 8 = 1 (в остатке 4);
- 1 ÷ 8 = 0 (в остатке 1).
Записываем остатки от деления на 8 в обратном порядке и получаем следующую последовательность: 1425. Полученный результат является восьмеричным представлением числа 789.
Из десятичной в шестнадцатеричную. Исходное число 7000, основание системы «16». Производим последовательное деление:
- 7000 ÷ 16 = 437 (в остатке 8);
- 437 ÷ 16 = 27 (в остатке 5);
- 27 ÷ 16 = 1 (в остатке 11);
- 1 ÷ 16 = 0 (в остатке 1).
Записываем остатки от деления на 16 в обратном порядке. Если остаток от деления больше 9, то вместо числа записываем букву, соответствие чисел и букв представлено ниже в таблице. В результате получаем следующую последовательность: 1B58. Полученный последовательность является шестнадцатеричным представлением числа 7000.
число | буква |
---|---|
10 | A |
11 | B |
12 | C |
13 | D |
14 | E |
15 | F |
Применение[править | править код]
Широко используется в низкоуровневом программировании и компьютерной документации, поскольку в современных компьютерах минимальной адресуемой единицей памяти является 8-битный байт, значения которого удобно записывать двумя шестнадцатеричными цифрами, а значение половины байта — полубайта — одной цифрой. Такое использование началось с системы IBM/360, где вся документация использовала шестнадцатеричную систему, в то время как в документации других компьютерных систем того времени (даже с 8-битными символами, как, например, PDP-11 или БЭСМ-6) использовали восьмеричную систему.
В стандарте Юникода номер символа принято записывать в шестнадцатеричном виде, используя не менее 4 цифр (при необходимости — с ведущими нулями).
Шестнадцатеричный цвет — запись трёх компонентов цвета (R, G и B) в шестнадцатеричном виде.
bin, oct, hex – системы исчисления
Вспомним основы информатики и поговорим о системах исчисления. В жизни мы привыкли к десятичной системе (base-10 или decimal), железо компьютеров оперирует в системе двоичной (base-2 или binary) – нулями и единицами. Часто приходится иметь дело с системой шестнадцатиричной (base-16 или hexadecimal), она позволяет записывать данные в 8 раз короче, чем двоичная. Реже встречается система восьмеричная (base-8 или octal). Система исчисления – это всего лишь средство представления числа, т.е. то, как мы его в строчку запишем или считаем, само число остается самим собой, независимо от системы.
Чтобы получить целое число из строки, записанной в какой-то системе исчисления, используем функцию int (второй параметр – база системы):
Наоборот сделать из числа строку в какой-то системе – встроенные функции bin, oct и hex:
В строке появились префиксы 0b , 0x и 0o . Как и в Си, в Python можно использовать эти префиксы для записи чисел в коде помимо обычного десятичного варианта, если это требуется:
Однако, часто приходится иметь дело с чистыми HEX-данными без префиксов. Многие (да и я) делали вот так:
Т.е. просто отрезали первые два символа. Это не очень интуитивно, да и может привести к неправильному поведению, если передать отрицательное число:
К счастью, есть встроенная функция format(value, format_spec) (не путать с str.format ), которая форматирует значение, согласно спецификатору форматирования:
- x — 16-ричное без префикса, маленькие букв
- X — 16-ричное без префикса, заглавные буквы
- #x — 16-ричное с префиксом, маленькие буквы
- b — двоичное число без префикса и т.д.
format(value, format_spec) эквивалентная вызову type(value).__format__(value, format_spec) .
Специально для канала @pyway. Подписывайтесь на мой канал в Телеграм @pyway
Источник
Знаковые байты
Байты могут быть знаковые (signed) и беззнаковые (unsigned). За знаковость числа, то есть за наличие знака «+» или «-» при переводе в DEC, отвечает старший бит этого байта. В NES все данные 8-битные, поэтому за знаковость числа отвечает бит7.
Unsigned
Беззнаковый байт, который хранит число от 0 до 255. Эти числа получаются при обычном переводе из HEX в DEC байтов #$00-#$FF.
В языке программирования C# тип данных «byte» — беззнаковый.
Signed
Знаковый байт, который хранит число от -128 до 127. Положительными байтами считаются от #$00 до #$7F (от 0 до 127), а отрицательными от #$80 до #$FF (от -128 до -1).
В языке программирования C# тип данных «sbyte» — знаковый.
Отличия
Знаковые байты в NES по сути ничем не отличаются от беззнаковых и выглядят одинаково. Все зависит от того, с какой точки зрения их рассматривать.
Отрицательные числа
Ранее было отмечено, что FFFFh фактически равно -1.
Однако если перевести число FFFFh в десятичную форму, то получится 65535.
Почему так происходит? Действительно ли FFFFh ведет себя как отрицательное число?
Пусть так, тогда если сложить FFFFh и 5, то должно получиться 4:
-h 5 FFFF 0004 0006
Похоже, Debug действительно обращается с FFFFh, как с -1.
Рассмотрим механизм сложения чисел 5 и FFFFh, при суммировании «столбиком»:
1111 0005 +FFFF 10004 5 + (-1) = 4
Если игнорировать единицу в старшем разряде, то получается правильный ответ 5 + (-1) = 4.
Debug сохраняет четыре младшие цифры результата.
Старший (пятый) разряд запоминается в специальной ячейке памяти и называется — «ПЕРЕПОЛНЕНИЕ».
FFFF | -1 |
FFFE | -2 |
FFFD | -3 |
FFFC | -4 |
FFFB | -5 |
FFFA | -6 |
FFF9 | -7 |
FFF8 | -8 |
FFF7 | -9 |
FFF6 | -A |
FFF5 | -B |
FFF4 | -C |
FFF3 | -D |
FFF2 | -E |
FFF1 | -F |
FFF0 | -10 |
Сложение чисел, больших чем 8000h дает переполнение. Такие числа ведут себя аналогично отрицательным числам:
1111 1111 0008 FFF0 +FFFA +8FFF 10002 8 + (-6) = 2 18FEF -10h + (-7001h) = -7011h
В последнем примере установлено соответствие чисел 8FEFh и -7011h.
Как проверить справедливость этого утверждения?
Ранее отмечалось, что FFFFh это (-1), значит FFFEh это (-2) и т.д.
В приведенной таблице представлен ряд отрицательных чисел.
Если ряд продолжить, то при достижении числа 8FEFh мы увидим его отрицательный эквивалент: -7011h
Любой язык программирования позволяет оперировать двумя типами чисел: знаковыми и беззнаковыми.
Представление числа зависит от конкретной ситуации.
Например: FFFAh можно рассматривать как число без знака, и как отрицательное число -6.
Если в программе нужны отрицательные числа, то диапазон 0 … FFFFh делится на две части:
0h ... 7FFFh - положительные числа 8000h ... FFFFh - отрицательные числа
Отрицательный аналог числа 8FEFh называется его дополнительным кодом, и выражается числом -7011h.
Рассмотрим алгоритм нахождения дополнительного кода:
- Инвертировать исходное число, т.е. заменить все цифры числа на противоположные:F => 0, E => 1, D => 2, C => 3, B => 4 и т.д. После инверсии 8FEFh выглядит так: 7010h
- К инверсному числу добавить единицу: 7010h + 1 = 7011h — получилось искомое число.
Если в программе используются только положительные числа, то область числовых значений ограничивается диапазоном:
0 ... FFFFh или 0 ... 65535
Если в вычислениях требуются отрицательные числа, то предыдущий диапазон смещается в отрицательную область:
-8000h ... 7FFFh или -32768 ... 32767
Деление чисел на два типа весьма условно, и определяется в основном потребностями программиста.
При этом микропроцессору совершенно безразлично, к каким типам мы относим те или иные числа.
Вычислите дополнительный код следующих чисел:
FF00h, AD3Fh, 9000h, EDF4h, B348h
Порядок следования байтов
Вопрос порядка следования байт возникает при оперировании c данными, имеющий размер от двух байт и более, потому что архитектура x86 использует порядок следования отличный от того, чем мы привыкли пользоваться. В листинге 1, показан пример записи кода ассемблера в мнемоническом представлении программистом (справа) и в машинных кодах (слева) результат работы GNU Assembler AS(1).
Листинг 1
. . . 11: 05 67 45 23 01 add $0x1234567,%eax 16: 66 05 ab 89 add $0x89ab,%ax 1a: 04 cd add $0xcd,%al 1c: 80 c4 ef add $0xef,%ah . . .
Как следует из листинга 1, 32-х разрядное целочисленное значение (без учета знака) по смещению 0x11 в машинных кодах содержит, как и полагает её типу, четыре следующих друг за другом байтов от старшего к младшему (big-endian), комбинируемые как сдвоенные слова. Такую же картину можно наблюдать с 16-ти разрядным словом по смещению 0x16, а вот данные по смещению 0x1a и 0x1с, имеющие размерность в один байт, не подвержены таким метаморфозам.
В том же листинге, слева приводится порядок запись данных – следующих друг за другом байтов от младшему к старшему (little-endian), который мы привыкли использовать со школьной скамьи.
Для конвертирования данных из формата «big-endian» в формат «little-endian» и обратно в архитектуре х86 предусмотрена инструкция BSWAP, которую так же можно использовать для повышения быстродействия вычислительных операций десятичной арифметики.
Инструкция BSWAP (от англ. byte swap – байтовая перестановка) изменяет порядок следования байтов в 32-х разрядном операнде следующим образом:
биты с 0 по 7 в нулевом байте меняются местами с битами в четвертом байте (биты 24, … ,31);
биты с 8 по 15 во втором меняются местами с битами в третьем байте (биты 6, … ,21).
В листинге 2 приводится пример использование инструкции BSWAP.
Листинг 2
. . . imm32_value: .int 0xD4C3B2A1 . . . movl imm32_value,%edx bswapl %edx,%eax . . .
В листинге 3 приводится результат выполнения BSWAP
Листинг 3
user@debian:~/gasrunparts-0.2$ src/gasrunparts bswap_intops Result: 0xA1B2C3D4
Для конвертирования 16-ти разрядных данных из формата «big-endian» в формат «little-endian» вместо инструкции BSWAP следует использовать XCHG, как показано в листинге 4.
Листинг 4
. . . imm16_value: .hword 0xF2E1 . . . movw imm16_value, %ax xchgb %al, %ah . . .
В листинге 5 приводится результат выполнения XCHG
Листинг 5
user@debian:~/gasrunparts-0.2$ src/gasrunparts xchgw_intops Result: 0xE1F2
На рис. 2 показан пример конвертирования 32-х и 16-ти разрядных данных из формата «big-endian» в формат «little-endian» в соответствие с кодом ассемблера, приводимом в листингах 2 и 3.
|
Рис. 2
Двоичная система счисления современных компьютеров
С появлением компьютеров постепенно совершили значительный поворот многие области знаний. Не стала исключением история чисел и систем счисления. Фото первого компьютера мало напоминает современное устройство, на мониторе которого вы читаете эту статью, но работа их обоих основана на счисления, коде, состоящем, только из нулей и единиц. Для обыденного сознания всё же остаётся удивительным, что с помощью комбинации из всего двух символов (фактически сигнала или его отсутствия) можно производить самые сложные вычисления и автоматически (при наличии соответствующей программы) переводить числа в десятиричной системе исчисления в числа в двоичной, шестнадцатиричной, шестидесятишестиричной и любой другой системе. И с помощью такого двоичного кода на мониторе изображается данная статья, где отражена история чисел и система счисления у разных цивилизаций в истории.
Издревле человек проявляет интерес к окружающему миру, пытается его изучить, а полученные знания систематизировать и упорядочить. Один из таких способ — счет. Для этого были придуманы В настоящее время существует множество способов счета и учета информации. В этой статье мы расскажем о том, что такое натуральные числа, какие бывают системы счисления, как их использовать, а также историю их возникновения.