Вывод целого отрицательного числа в шестнадцатеричной системе счисления
Как вывести дополнительный код hex целого отрицательного числа, вводимого в десятеричной системе счисления?
Если число вводится именно как отрицательное, то его представление в дополнительно коде совпадает с представлением этого же числа, приведенного к беззнаковому целому типу того же размера (при этом старший бит беззнакового представления соответствует знаковому биту знакового представления)
Однако спецификация поведения std::hex в данном контексте и так гарантирует (гарантирует ли?), что выводимое значение будет внутренне приведено к соответствующему беззнаковому типу, поэтому можно просто
(Эта часть вызывает у меня определенные сомнения. Лучше все-таки предварительно привести самостоятельно.)
Если же задача подразумевает, что надо сформировать представление в дополнительном коде числа -n для некоего вводимого положительного числа n , то делается это путем инверсии всех битов числа с последующим инкрементом результата
Как перевести отрицательное число в шестнадцатеричную систему
Пример №1 .

Перевод из 2 в 8 в 16 системы счисления.
Эти системы кратны двум, следовательно, перевод осуществляется с использованием таблицы соответствия (см. ниже).
Для перевода числа из двоичной системы счисления в восьмиричную (шестнадцатиричную) необходимо от запятой вправо и влево разбить двоичное число на группы по три (четыре – для шестнадцатиричной) разряда, дополняя при необходимости нулями крайние группы. Каждую группу заменяют соответствующей восьмиричной или шестнадцатиричной цифрой.
Пример №2 . 1010111010,1011 = 1.010.111.010,101.1 = 1272,518
здесь 001=1; 010=2; 111=7; 010=2; 101=5; 001=1
При переводе в шестнадцатеричную систему необходимо делить число на части, по четыре цифры, соблюдая те же правила.
Пример №3 . 1010111010,1011 = 10.1011.1010,1011 = 2B12,13HEX
здесь 0010=2; 1011=B; 1010=12; 1011=13
Перевод чисел из 2 , 8 и 16 в десятичную систему исчисления производят путем разбивания числа на отдельные и умножения его на основание системы (из которой переводится число) возведенное в степень соответствующую его порядковому номеру в переводимом числе. При этом числа нумеруются влево от запятой (первое число имеет номер 0) с возрастанием, а в правую сторону с убыванием (т.е. с отрицательным знаком). Полученные результаты складываются.
Пример №4 .
Пример перевода из двоичной в десятичную систему счисления. Пример перевода из восьмеричной в десятичную систему счисления. Пример перевода из шестнадцатеричной в десятичную систему счисления.
Еще раз повторим алгоритм перевода чисел из одной системы счисления в другую ПСС
- Из десятичной системы счисления:
- разделить число на основание переводимой системы счисления;
- найти остаток от деления целой части числа;
- записать все остатки от деления в обратном порядке;
- Из двоичной системы счисления
- Для перевода в десятичную систему счисления необходимо найти сумму произведений основания 2 на соответствующую степень разряда;
- Для перевода числа в восьмеричную необходимо разбить число на триады.
Например, 1000110 = 1 000 110 = 1068 - Для перевода числа из двоичной системы счисления в шестнадцатеричную необходимо разбить число на группы по 4 разряда.
Например, 1000110 = 100 0110 = 4616
Позиционной называется система, для которой значимость или вес цифры зависит от ее места расположения в числе. Соотношение между системами выражается таблицей.
Таблица соответствия систем счисления:
| Двоичная СС | Шестнадцатеричная СС |
| 0000 | 0 |
| 0001 | 1 |
| 0010 | 2 |
| 0011 | 3 |
| 0100 | 4 |
| 0101 | 5 |
| 0110 | 6 |
| 0111 | 7 |
| 1000 | 8 |
| 1001 | 9 |
| 1010 | A |
| 1011 | B |
| 1100 | C |
| 1101 | D |
| 1110 | E |
| 1111 | F |
Таблица для перевода в восьмеричную систему счисления
| Двоичная СС | Восьмеричная СС |
| 000 | 0 |
| 001 | 1 |
| 010 | 2 |
| 011 | 3 |
| 100 | 4 |
| 101 | 5 |
| 110 | 6 |
| 111 | 7 |
Пример №2 . Перевести число 100,12 из десятичной системы счисления в восьмеричную систему счисления и обратно. Пояснить причины расхождений.
Решение.
1 Этап. Перевод числа из десятичной системы счисления в восьмеричную систему счисления.
| Целая часть от деления | Остаток от деления |
| 100 div 8 = 12 | 100 mod 8 = 4 | 12 div 8 = 1 | 12 mod 8 = 4 | 1 div 8 = 0 | 1 mod 8 = 1 |
Остаток от деления записываем в обратном порядке. Получаем число в 8-ой системе счисления: 144
100 = 1448
Для перевода дробной части числа последовательно умножаем дробную часть на основание 8. В результате каждый раз записываем целую часть произведения.
0.12*8 = 0.96 (целая часть 0)
0.96*8 = 7.68 (целая часть 7)
0.68*8 = 5.44 (целая часть 5)
0.44*8 = 3.52 (целая часть 3)
Получаем число в 8-ой системе счисления: 0753.
0.12 = 0.7538
2 Этап. Перевод числа из десятичной системы счисления в восьмеричную систему счисления.
Обратный перевод из восьмеричной системы счислений в десятичную.
Для перевода целой части необходимо умножить разряд числа на соответствующую ему степень разряда.
144 = 8 2 *1 + 8 1 *4 + 8 0 *4 = 64 + 32 + 4 = 100
Для перевода дробной части необходимо разделить разряд числа на соответствующую ему степень разряда
0753 = 8 -1 *0 + 8 -2 *7 + 8 -3 *5 + 8 -4 *3 = 0.119873046875 = 0.1199
144,07538 = 100,9610
Разница в 0,0001 (100,12 — 100,1199) объясняется погрешностью округлений при переводе в восьмеричную систему счислений. Эту погрешность можно уменьшить, если взять большее число разрядов (например, не 4, а 8).
Сдающим ЕГЭ и не только…
Странно, что в школах на уроках информатики обычно показывают ученикам самый сложный и неудобный способ перевода чисел из одной системы в другую. Это способ заключается в последовательном делении исходного числа на основание и сборе остатков от деления в обратном порядке.
Например, нужно перевести число 81010 в двоичную систему:

Результат записываем в обратном порядке снизу вверх. Получается 81010 = 11001010102
Если нужно переводить в двоичную систему довольно большие числа, то лестница делений приобретает размер многоэтажного дома. И как тут собрать все единички с нулями и ни одной не пропустить?
В программу ЕГЭ по информатике входят несколько задач, связанных с переводом чисел из одной системы в другую. Как правило, это преобразование между 8- и 16-ричными системами и двоичной. Это разделы А1, В11. Но есть и задачи с другими системами счисления, как например, в разделе B7.
Для начала напомним две таблицы, которые хорошо бы знать наизусть тем, кто выбирает информатику своей дальнейшей профессией.
Таблица степеней числа 2:
| 2 1 | 2 2 | 2 3 | 2 4 | 2 5 | 2 6 | 2 7 | 2 8 | 2 9 | 2 10 |
| 2 | 4 | 8 | 16 | 32 | 64 | 128 | 256 | 512 | 1024 |
Она легко получается умножением предыдущего числа на 2. Так, что если помните не все эти числа, остальные нетрудно получить в уме из тех, которые помните.
Таблица двоичных чисел от 0 до 15 c 16-ричным представлением:
| 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 |
| 0000 | 0001 | 0010 | 0011 | 0100 | 0101 | 0110 | 0111 | 1000 | 1001 | 1010 | 1011 | 1100 | 1101 | 1110 | 1111 |
| 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | A | B | C | D | E | F |
Недостающие значения тоже нетрудно вычислить, прибавляя по 1 к известным значениям.
Перевод целых чисел
Итак, начнем с перевода сразу в двоичную систему. Возьмём то же число 81010. Нам нужно разложить это число на слагаемые, равные степеням двойки.
- Ищем ближайшую к 810 степень двойки, не превосходящую его. Это 2 9 = 512.
- Вычитаем 512 из 810, получаем 298.
- Повторим шаги 1 и 2, пока не останется 1 или 0.
- У нас получилось так: 810 = 512 + 256 + 32 + 8 + 2 = 2 9 + 2 8 + 2 5 + 2 3 + 2 1 .
Далее есть два способа, можно использовать любой из них. Как легко увидеть, что в любой системе счисления её основание всегда 10. Квадрат основания всегда будет 100, куб 1000. То есть степень основания системы счисления — это 1 (единица), и за ней столько нулей, какова степень.
Способ 1: Расставить 1 по тем разрядам, какие получились показатели у слагаемых. В нашем примере это 9, 8, 5, 3 и 1. В остальных местах будут стоять нули. Итак, мы получили двоичное представление числа 81010 = 11001010102 . Единицы стоят на 9-м, 8-м, 5-м, 3-м и 1-м местах, считая справа налево с нуля.
Способ 2: Распишем слагаемые как степени двойки друг под другом, начиная с большего.
| 2 9 = | 1000000000 | (1 и девять нулей) + |
| 2 8 = | 100000000 | (1 и восемь нулей) + |
| 2 5 = | 100000 | (1 и пять нулей) + |
| 2 3 = | 1000 | (1 и три нуля) + |
| 2 1 = | 10 | (1 и один ноль) |
А теперь сложим эти ступеньки вместе, как складывают веер: 1100101010 .
Вот и всё. Попутно также просто решается задача «сколько единиц в двоичной записи числа 810?».
Ответ — столько, сколько слагаемых (степеней двойки) в таком его представлении. У 810 их 5.
Теперь пример попроще.
Переведём число 63 в 5-ричную систему счисления. Ближайшая к 63 степень числа 5 — это 25 (квадрат 5). Куб (125) будет уже много. То есть 63 лежит между квадратом 5 и кубом. Тогда подберем коэффициент для 5 2 . Это 2.
Получаем 6310 = 50 + 13 = 50 + 10 + 3 = 2 * 5 2 + 2 * 5 + 3 = 2235 .
Ну и, наконец, совсем лёгкие переводы между 8- и 16-ричными системами. Так как их основанием является степень двойки, то перевод делается автоматически, просто заменой цифр на их двоичное представление. Для 8-ричной системы каждая цифра заменяется тремя двоичными разрядами, а для 16-ричной четырьмя. При этом все ведущие нули обязательны, кроме самого старшего разряда.
Переведем в двоичную систему число 5478.
| 5478= | 101 | 100 | 111 |
| 5 | 4 | 7 |
Ещё одно, например 7D6A16.
| 7D6A16= | (0)111 | 1101 | 0110 | 1010 |
| 7 | D | 6 | A |
Переведем в 16-ричную систему число 7368. Сначала цифры запишем тройками, а потом поделим их на четверки с конца: 7368 = 111 011 110 = 1 1101 1110 = 1DE16 . Переведем в 8-ричную систему число C2516. Сначала цифры запишем четвёрками, а потом поделим их на тройки с конца: C2516 = 1100 0010 0101 = 110 000 100 101 = 60458 . Теперь рассмотрим перевод обратно в десятичную. Он труда не представляет, главное не ошибиться в расчётах. Раскладываем число на многочлен со степенями основания и коэффициентами при них. Потом всё умножаем и складываем. E6816 = 14 * 16 2 + 6 * 16 + 8 = 3688 . 7328 = 7 * 8 2 + 3*8 + 2 = 474 .
Перевод отрицательных чисел
Здесь нужно учесть, что число будет представлено в дополнительном коде. Для перевода числа в дополнительный код нужно знать конечный размер числа, то есть во что мы хотим его вписать — в байт, в два байта, в четыре. Старший разряд числа означает знак. Если там 0, то число положительное, если 1, то отрицательное. Слева число дополняется знаковым разрядом. Беззнаковые (unsigned) числа мы не рассматриваем, они всегда положительные, а старший разряд в них используется как информационный.
Для перевода отрицательного числа в двоичный дополнительный код нужно перевести положительное число в двоичную систему, потом поменять нули на единицы и единицы на нули. Затем прибавить к результату 1.
Итак, переведем число -79 в двоичную систему. Число займёт у нас один байт.
Переводим 79 в двоичную систему, 79 = 1001111. Дополним слева нулями до размера байта, 8 разрядов, получаем 01001111. Меняем 1 на 0 и 0 на 1. Получаем 10110000. К результату прибавляем 1, получаем ответ 10110001 . Попутно отвечаем на вопрос ЕГЭ «сколько единиц в двоичном представлении числа -79?». Ответ — 4.
Прибавление 1 к инверсии числа позволяет устранить разницу между представлениями +0 = 00000000 и -0 = 11111111. В дополнительном коде они будут записаны одинаково 00000000.
Перевод дробных чисел
Дробные числа переводятся способом, обратным делению целых чисел на основание, который мы рассмотрели в самом начале. То есть при помощи последовательного умножения на новое основание с собиранием целых частей. Полученные при умножении целые части собираются, но не участвуют в следующих операциях. Умножаются только дробные. Если исходное число больше 1, то целая и дробная части переводятся отдельно, потом склеиваются.
Переведем число 0,6752 в двоичную систему.
| 0 | ,6752 |
| *2 | |
| 1 | ,3504 |
| *2 | |
| 0 | ,7008 |
| *2 | |
| 1 | ,4016 |
| *2 | |
| 0 | ,8032 |
| *2 | |
| 1 | ,6064 |
| *2 | |
| 1 | ,2128 |
Процесс можно продолжать долго, пока не получим все нули в дробной части или будет достигнута требуемая точность. Остановимся пока на 6-м знаке.
Получается 0,6752 = 0,101011 .
Если число было 5,6752, то в двоичном виде оно будет 101,101011 .
Contents
Введение
В повседневной деятельности мы привыкли к счету с применением цифр 1, 2, 3 и т. д. Вследствие технических особенностей, компьютер применяет другой метод счета, в котором используется всего две цифры 0 и 1. Например, до пяти компьютер считает так: 1, 10, 11, 100, 101. Числа 10, 11, 100 . являются двоичными, они базируются на системе счисления, состоящей из двух цифр. Десятичная система состоит из десяти цифр 0 . 9.
Одно и тоже число можно записать в разных системах счисления. Например: двоичное число 10 соответствует десятичному 2.
Компьютер может оперировать только двоичными числами. Но программисту очень неудобно использовать длинные цепочки нулей и единиц, отображающих разные числовые значения. Поэтому, для написания программ был придуман другой, более компактный способ записи чисел – шестнадцатеричная система счисления.
Изучение шестнадцатеричной системы счисления мы начнем в специальной программе — DEBUG.EXE, которая входит в состав операционной системы Windows.
Debug
Название Debug произошло от слова «Bugs» (насекомые) — так программисты именуют ошибки в программе.
Используя Debug можно проверить работу программы в пошаговом режиме. Это позволяет найти и исправить возможные ошибки. Данный процесс называется отладка «debugging», отсюда и произошло название программы.
Термин «debugging» (обезжучивание) имеет глубокие корни — он появился в тот день, когда перестал работать компьютер Гарвардского университета Марк 1. После долгих поисков техники обнаружили небольшую моль, попавшую между контактами реле. Они удалили моль и внесли запись в сменный журнал о процессе под названием «debugging», произведенном над Марком.
Наиболее удобной средой для изучения Debug является файл-менеджер FAR. Для запуска Debug необходимо в командной строке FAR-а набрать команду «debug» и нажать [Enter]:
Дефис означает, что Debug ждет команды. Чтобы покинуть программу наберите команду «Q» (Quit — выход) и нажмите ввод:
Для сложение и вычитание двух шестнадцатеричных чисел используем команду «H» (Hex – шестнадцатеричный), например:
Debug печатает сумму 3 + 2 = 5 и разность 3 — 2 = 1. С числами от 0 до 9 Debug ведет себя как с десятичными числами. Сходство между шестнадцатеричной и десятичной системами заканчивается при получении результата больше девяти, например 9 + 1:
A — это шестнадцатеричное число, аналог десятичного числа 10. Выполните вычисления: 9 + 2, 9 + 3, 9 + 4, 9 + 5, 9 + 6. В результате получатся остальные числа: B, C, D, E, F. Такой способ записи чисел является очень компактным и удобным с точки зрения представления информации в компьютере.
Debug работает только с шестнадцатеричными числами. Некоторые операции с такими числами могут давать не совсем обычные результаты. Например, сложите 8 + 8:
10 — это шестнадцатеричное число, аналог десятичного числа 16. Теперь найдите разность между числами 2 и 3:
Разность чисел FFFF — это шестнадцатеричное число, соответствующее единице со знаком минус «-1». Попробуйте получить -2, -3 и другие отрицательные числа.
Перевод шестнадцатеричных чисел в десятичную форму
Название «шестнадцатеричный» произошло от числа 16. Цифры 0 . 9 одинаковы и для шестнадцатеричной, и для десятичной систем счисления. Шестнадцатеричные цифры от A до F соответствуют десятичным числам от 10 до 15. Соответствие между десятичными числами (Decimal) и шестнадцатеричными (Hexadecimal) можно представить в виде таблицы:
| dec | hex |
|---|---|
| 0 | 0 |
| 1 | 1 |
| 2 | 2 |
| 3 | 3 |
| 4 | 4 |
| 5 | 5 |
| 6 | 6 |
| 7 | 7 |
| 8 | 8 |
| 9 | 9 |
| 10 | A |
| 11 | B |
| 12 | C |
| 13 | D |
| 14 | E |
| 15 | F |
| 16 | 10 |
| 17 | 11 |
| 18 | 12 |
| 19 | 13 |
| 20 | 14 |
Обычно шестнадцатеричные числа помечают специальным символом «h»: 12h, F8h, 10h и др. Это позволяет избегать путаницы между десятичными и шестнадцатеричными числами, не содержащими букв: 12 — десятичное, 12h — шестнадцатеричное.
Для перевода чисел из hex- в dec- форму используется очень простой алгоритм.
Например, переведем A7h в десятичную форму:
| 1 | переводим обе цифры в десятичную форму | A => 10 7 => 7 |
| 2 | умножаем каждое число на коэффициент, соответствующий разряду числа (весовой коэффициент) | 10 * 16 1 = 160 7 * 16 0 = 7 |
| 3 | складываем полученные числа | 160 + 7 = 167 |
Шестнадцатеричное число A7h соответствует десятичному числу 167.
Данный пример можно записать более компактно:
A => 10 * 16 1 = 160
7 => 7 * 16 0 = 7 перевод числа A7h в десятичную форму
A7h = 160 + 7 = 167
Примеры перевода чисел из одной системы счисления в другую:
| Перевод 2E8h в десятичную форму: | Перевод AF1Ch в десятичную форму: |
2 => 2 * 16 2 = 512
E => 14 * 16 1 = 224
8 => 8 * 16 0 = 8
2E8h = 512 + 224 + 8 = 744
A => 10 * 16 3 = 40960
F => 15 * 16 2 = 3840
1 => 1 * 16 1 = 16
C => 12 * 16 0 = 12
AF1Ch = 40960 + 3840 + 16 + 12 = 44828
3 => 3 * 16 4 = 196608
B => 11 * 16 3 = 45056
8 => 8 * 16 2 = 2048
D => 13 * 16 1 = 208
2 => 2 * 16 0 = 2
3B8D2h = 196608 + . + 2 = 243922
Переведите следующие шестнадцатеричные числа в десятичную форму:
Сложение и вычитание шестнадцатеричных чисел
Сложение и вычитание шестнадцатеричных чисел проходит аналогично действиям над десятичными числами.
Приведем несколько простых примеров:
Рассмотрим, как получается 1Eh в результате сложения F + F. Запишем результат операции в десятичном виде: F + F = 15 + 15 = 30.
Проверим, сколько шестнадцатеричных десятков содержится в числе 30: 30 / 16 = 1 (один десяток). Шестнадцатеричный десяток 10h соответствует десятичному числу 16. Проводим вычитание 30 — 16 и получаем остаток 14, откуда: 14 + 16 = Eh + 10h = 1Eh.
Числа с большим числом разрядов можно складывать «столбиком»:
Вычислите «столбиком» следующие примеры, а результаты проверьте в Debug:
Пятизначные шестнадцатеричные числа
Что произойдет, если в сложении использовать пятизначное шестнадцатеричное число? Вычислим сумму следующих чисел:
Debug сообщил об ошибке. Команда «h» не может обрабатывать числа, длина которых больше четырех разрядов. Шестнадцатеричное число, состоящее из четырех разрядов называют так: «СЛОВО» или «WORD».
Если сложить два «слова», например C000h и D000h, то вместо действительного результата 19000h получится «урезанный» до четырех разрядов результат 9000h:
Debug сохраняет четыре младших цифры ответа, а единицу из старшего разряда заносит в специальную ячейку, которая будет рассмотрена позже.
Подумайте, какое значение имеет старший (пятый) разряд при сложении четырехразрядных шестнадцатеричных чисел?
Перевод десятичных чисел в шестнадцатеричную форму
Перевод десятичного числа в шестнадцатеричную форму выполняется делением исходного числа на 16. Например, переведем 300 в шестнадцатеричную форму:
Примеры перевода чисел 1000 и 60000 в шестнадцатеричную форму:
Переведите следующие числа в шестнадцатеричную форму:
Шестнадцатеричный результат переведите обратно в десятичную форму — это позволит проверить корректность ваших действий.
Отрицательные числа
Ранее было отмечено, что FFFFh фактически равно -1. Однако если перевести число FFFFh в десятичную форму, то получится 65535. Почему так происходит? Действительно ли FFFFh ведет себя как отрицательное число?
Пусть так, тогда если сложить FFFFh и 5, то должно получиться 4:
Похоже, Debug действительно обращается с FFFFh, как с -1. Рассмотрим механизм сложения чисел 5 и FFFFh, при суммировании «столбиком»:
Если игнорировать единицу в старшем разряде, то получается правильный ответ 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 дает переполнение. Такие числа ведут себя аналогично отрицательным числам:
В последнем примере установлено соответствие чисел 8FEFh и -7011h. Как проверить справедливость этого утверждения? Ранее отмечалось, что FFFFh это (-1), значит FFFEh это (-2) и т.д. В приведенной таблице представлен ряд отрицательных чисел. Если ряд продолжить, то при достижении числа 8FEFh мы увидим его отрицательный эквивалент: -7011h
Любой язык программирования позволяет оперировать двумя типами чисел: знаковыми и беззнаковыми. Представление числа зависит от конкретной ситуации. Например: FFFAh можно рассматривать как число без знака, и как отрицательное число -6. Если в программе нужны отрицательные числа, то диапазон 0 . FFFFh делится на две части:
Отрицательный аналог числа 8FEFh называется его дополнительным кодом, и выражается числом -7011h. Рассмотрим алгоритм нахождения дополнительного кода:
- Инвертировать исходное число, т.е. заменить все цифры числа на противоположные:
F => 0, E => 1, D => 2, C => 3, B => 4 и т.д. После инверсии 8FEFh выглядит так: 7010h - К инверсному числу добавить единицу: 7010h + 1 = 7011h — получилось искомое число.
Если в программе используются только положительные числа, то область числовых значений ограничивается диапазоном:
Если в вычислениях требуются отрицательные числа, то предыдущий диапазон смещается в отрицательную область:
Деление чисел на два типа весьма условно, и определяется в основном потребностями программиста. При этом микропроцессору совершенно безразлично, к каким типам мы относим те или иные числа.
Вычислите дополнительный код следующих чисел:
Двоичная система счисления
Микропроцессор, будучи устройством электронным, воспринимает цифры, как комбинации электрических сигналов. Например, число может быть представлено так:
При этом вероятность возникновения ошибки (например, из-за колебаний напряжения) очень велика. Наиболее надежным способом представления чисел в электронном устройстве, является двоичная система счисления:
Такая разница между уровнями сигналов (соответствующих «0» и «1») практически исключает ошибки связанные с колебаниями напряжения и другими искажениями сигнала. Кроме того, значительно упрощается компонентная база компьютера.
Таким образом, двоичная система счисления стала единым стандартом представления чисел в любом «думающем» электронном устройстве.
Двоичная система оптимальна для разработки микропроцессорных систем, но очень неудобна для написания программ. Чтобы упростить процесс общения с микропроцессором, были разработаны программы, транслирующие шестнадцатеричные числа в двоичный код, и выполняющие обратное преобразование. Одной из таких программ является Debug.
Для вывода на экран чисел в шестнадцатеричном формате, Debug использует небольшую подпрограмму, которая переводит двоичные числа (обрабатываемые микропроцессором), в шестнадцатеричную форму.
Двоичные числа мы будем помечать индексом «b» (binary — двоичный), например: 10010111b
Рассмотрим число 1101b. Все разряды числа характеризуются весовыми коэффициентами, которые получаются возведением основания системы счисления (два) в степень, соответствующую номеру разряда. Нумерация разрядов начинается с нуля.
Для перевода числа из двоичной системы в десятичную, необходимо выбрать весовые коэффициенты тех разрядов, где есть единица (в случае числа 1101b, это: 2 3 , 2 2 и 2 0 ). Далее нужно сложить эти числа: 2 3 + 2 2 + 2 0 = 13
| Номера разрядов | 3 | 2 | 1 | 0 |
|---|---|---|---|---|
| Весовые коэффициенты | 2 3 | 2 2 | 2 1 | 2 0 |
| Число | 1 | 1 | 0 | 1 |
Перевод числа 11010010b в десятичную форму:
| 2 7 | 2 6 | 2 5 | 2 4 | 2 3 | 2 2 | 2 1 | 2 0 |
| 1 | 1 | 0 | 1 | 0 | 0 | 1 | 0 |
| 2 7 + 2 6 + 2 4 + 2 1 = 210 | |||||||
Переведите следующие двоичные числа в десятичный формат:
По размеру двоичные числа делятся на следующие:
Графически это разделение можно показать так:
| bin | hex | dec |
|---|---|---|
| 0000 | 0 | 0 |
| 0001 | 1 | 1 |
| 0010 | 2 | 2 |
| 0011 | 3 | 3 |
| 0100 | 4 | 4 |
| 0101 | 5 | 5 |
| 0110 | 6 | 6 |
| 0111 | 7 | 7 |
| 1000 | 8 | 8 |
| 1001 | 9 | 9 |
| 1010 | A | 10 |
| 1011 | B | 11 |
| 1100 | C | 12 |
| 1101 | D | 13 |
| 1110 | E | 14 |
| 1111 | F | 15 |
Рассмотрим таблицу, в которой отражено соответствие двоичных, шестнадцатеричных и десятичных чисел.
Из таблицы видно, что двоичная и шестнадцатеричная системы кратны между собой. Данную пропорциональность в размерности чисел можно сформулировать так:
Благодаря кратности, преобразования чисел из двоичной системы в шестнадцатеричную, выполняются очень просто. Двоичное число разбивается на декады (четырехбитные фрагметны):
Каждая декада переводится в шестнадцатеричный формат, аналогично преобразованию чисел из двоичной системы счисления в десятичную:
Переведите следующие числа в шестнадцатеричную форму:
Арифметические действия с двоичными числами выполняются аналогично действиям с десятичными числами. Например, сложение одноразрядных двоичных чисел выглядит так:
Сложение четырехразрядных и восьмиразрядных двоичных чисел:
Выполните следующие действия:
(проверку результатов выполните в шестнадцатеричной системе счисления)
Дополнительный код
| 0000 0000 0000 0000 | 0000h |
| . | . |
| 0111 1111 1111 1111 | 7FFFh |
| 1000 0000 0000 0000 | 8000h |
| . | . |
| 1111 1111 1111 1111 | FFFFh |
Раннее отмечалось, что в некоторых случаях числа 8000h . FFFFh ведут себя как отрицательные.
Рассмотрим числа 0 . FFFFh в двоичной системе счисления. Данный ряд делится на две равные части. Cтарший бит, в двоичном представлении чисел, выделен жирным шрифтом. Начиная с числа 8000h, старший бит устанавливается в единицу.
Старший бит является признаком отрицательного числа. По его состоянию микропроцессор определяет знак числа. Но если в программе используются команды для чисел без знака, то микропроцессор игнорирует знаковый бит, и воспринимает диапазон [0 . FFFFh] как ряд положительных чисел.
Числа, в которых старший бит используется для хранения знака, известны как двоичное дополнение положительных чисел или дополнительный код.
Ранее мы находили дополнительный код шестнадцатеричных чисел (вспомните инверсию шестнадцатеричного числа с добавлением единицы). Дополнительный код двоичного числа определяется аналогично. Например, найдем дополнительный код числа 1101011010001001:
Вычитание двоичных чисел, например A — B, сводится к их сложению A + (-B). При этом: A не меняется, B преобразуется в дополнительный код. Далее числа складываются. Например, надо произвести вычитание 1101b — 1010b:
Отрицательные числа
Для представления отрицательных чисел в компьютере используют дополнительный код . Дополнительный код представляет собой дополнение модуля отрицательного числа до 0. Алгоритм получения дополнительного кода для отрицательного числа состоит из 3-х шагов.
Шаг 1: Записать модуль числа в прямом коде в n двоичных разрядах. Число 2009 в двоичной системе счисления равно 11111011001. Прямой 16разрядный код числа 2009 равен 0000011111011001.
Шаг 2: Получить обратный код, инвертируя значения всех битов в прямом коде числа. В нашем примере получим обратный код: 1111100000100110. Шаг 3: Прибавить 1 к полученному обратному коду.
1111100000100110 + 1 = 1111100000100111
Итак, отрицательное число –2009 в 16-разрядном компьютерном представ-
лении будет равно 1111100000100111.
Арифметические операции в двоичной системе счисления
Сложение в двоичной системе счисления.
Правила выполнения в двоичной системе счисления арифметического сложения одноразрядных чисел,
Как представить отрицательное шестнадцатеричное число?
Если у меня отрицательное десятичное число, скажем, -5, я преобразовал его в шестнадцатеричный формат. Смогу ли я просто поставить знак минуса перед шестнадцатеричным числом? Или есть другой способ сделать это, например, с комплиментом 2 в двоичном формате?
1 ответ
Не существует «единственного способа» представить отрицательное число. Тем не менее, существует ряд стандартных способов представления отрицательного числа. Чтобы не усложнять математику, я предполагаю, что все числа используют 4 бита.
- Используйте знаковый бит (в двоичном формате) 0111 равен 7, но 1111 равен -7. (также можно сделать в обратном порядке 0111 равно -7 1111 равно 7.
- Используйте дополнение до 1. 0111 равно 7, но 1000 равно -7 (все биты перевернуты. Это имеет нечетное свойство: 0000 является естественным 0, но 1111 является (отрицательным нулем) -0.
- Используйте дополнение 2. Отрицание — это дополнение 1 плюс один, поэтому 0111 равно 7, а 1000 + 0001 или 1001 равно -7. Это усиливает целочисленное переполнение, чтобы не поддерживать отрицательный ноль. 0000 инвертируется — это 1111 + 0001 , которое переполняется до 0000 . У него также есть несколько хороших свойств, таких как добавление некоторого числа плюс его отрицательное значение разрешает ноль, при условии, что оба числа могут быть записаны (отрицательного числа на одно больше, чем положительного). 7 + (-7) — это 0111 + 1001 , которое переполняется до 0 0000 .
Вы можете услышать поговорку, что «биты означают все, что вы хотите, чтобы они значили». Это означает, что вы можете придумать любое количество способов представить что угодно, вы просто создаете «карту» битов с желаемыми значениями. Например, вот странный и причудливый способ представления простых чисел.
С такой системой будет сложно выполнять математические вычисления, но это пример того, что вам не нужно ограничиваться каким-либо конкретным способом выполнения каких-либо действий. Пока вы создаете подпрограммы для получения ожидаемого вывода из ожидаемого ввода, вы можете сделать так, чтобы отображение битов в значения означало все, что вы хотите.
Идея смысла как вещи, которую вы навязываете битам, очень важна. Когда вы начинаете работать с текстом, «кодировка» — это значение, налагаемое на биты, хранящие текст, причем одни и те же биты иногда кодируют разные буквы в разных схемах кодирования.