Cистемы счисления

Хакерский редактор 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. Однако, в составе числа, двойка стоит на позиции сотен, а семёрка — на позиции единиц, поэтому количественное представление двойки — две сотни, или двести, а семёрка — всё та же семь.Многие, кроме десятичной СС, о других позиционных системах не имеют представления, хотя и часто ими пользуются. Например: 

  1. шестидесятиричная (Древний Вавилон) — первая позиционная система счисления. До сих пор при измерении времени используется основание равное 60 (1 мин = 60 с, 1 ч = 60 мин);
  2. двенадцатеричная система счисления (широкое распространение получила в XIX в. Число12 — «дюжина»: в сутках две дюжины часов. Счет не по пальцам. а по суставам пальцев. На каждом пальце руки, кроме большого, по 3 сустава — всего 12;

В настоящее время наиболее распространенными позиционными системами счисления являются десятичная, двоичная, восьмеричная и шестнадцатеричная.Общее свойство всех позиционных систем счисления: при каждом переходе влево (вправо) в записи числа на один разряд величина цифры увеличивается (уменьшается) во столько раз, чему равно основание системы счисления.Достоинства позиционных систем счисления:

  • в позиционных системах счисления устранены все недостатки непозиционных:
  • в них можно записать любое число (как натуральное, таки действительное);
  • запись чисел компактна и удобна;
  • благодаря поразрядной организации записи чисел с ними легко проводить математические операции.

Непозиционные системы счисления

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

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 = 1\).

  2. Предположение индукции. Пусть существует представление \(X = \sum_{i=0}^n a_i P^i,\) удовлетворяющее условиям теоремы.

  3. Докажем, что существует представление \(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

Виды систем счисления

Существует несколько различных систем счисления, которые используются для представления чисел и информации в компьютерной науке:

  1. Десятичная система счисления — наиболее распространенная система счисления, которую мы используем в повседневной жизни. Она основана на числах от 0 до 9 и использует позиционную нотацию, где каждая позиция числа имеет определенное значение в зависимости от ее положения.
  2. Двоичная система счисления — основная система счисления в компьютерной науке. Она использует только две цифры — 0 и 1 — и основана на системе двоичной арифметики. Двоичные числа обычно представляются с помощью комбинаций нулей и единиц, называемых битами.
  3. Шестнадцатеричная система счисления — система счисления, которая использует 16 цифр: от 0 до 9 и от A до F. Она используется в компьютерных системах для более удобного представления двоичных значений. В шестнадцатеричной системе каждая цифра соответствует 4-м битам двоичной системы.
  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.
Рассмотрим алгоритм нахождения дополнительного кода:

  1. Инвертировать исходное число, т.е. заменить все цифры числа на противоположные:F => 0, E => 1, D => 2, C => 3, B => 4 и т.д. После инверсии 8FEFh выглядит так: 7010h
  2. К инверсному числу добавить единицу: 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.

 
$0xD4C3B2A1 bswap $0xA1B2C3D4
D416 C316 B216 A116 A116 B216 C316 D416

 

  $0xF2E1 xchg $0xE1F2  
    F216 E116 E116 F216    

 

Рис. 2

Двоичная система счисления современных компьютеров

С появлением компьютеров постепенно совершили значительный поворот многие области знаний. Не стала исключением история чисел и систем счисления. Фото первого компьютера мало напоминает современное устройство, на мониторе которого вы читаете эту статью, но работа их обоих основана на счисления, коде, состоящем, только из нулей и единиц. Для обыденного сознания всё же остаётся удивительным, что с помощью комбинации из всего двух символов (фактически сигнала или его отсутствия) можно производить самые сложные вычисления и автоматически (при наличии соответствующей программы) переводить числа в десятиричной системе исчисления в числа в двоичной, шестнадцатиричной, шестидесятишестиричной и любой другой системе. И с помощью такого двоичного кода на мониторе изображается данная статья, где отражена история чисел и система счисления у разных цивилизаций в истории.

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

Рейтинг
( Пока оценок нет )
Понравилась статья? Поделиться с друзьями:
Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!:
Нажимая на кнопку "Отправить комментарий", я даю согласие на обработку персональных данных и принимаю политику конфиденциальности.