СРОСОБЫ ПРЕДСТАВЛЕНИЯ ОТРИЦАТЕЛЬНЫХ ЧИСЕЛ. ДОПОЛНИТЕЛЬНЫЙ КОД
Алгоритм перевода чисел из одной системы счисления в другую наиболее прост в том случае, когда одно из оснований этих систем является степенью другой, как, например, в случае двоичной и восьмеричной систем счисления. В таком случае алгоритм перевода состоит в простой замене чисел одной системы на равные им числа другой системы счисления (в случае положительных чисел). На начальном этапе удобно и полезно воспользоваться таблицей соответствия, приведенной в Приложении.
Пусть требуется перевести восьмеричное число 24738 в двоичное число. Воспользовавшись Таблицей соответствия из Приложения, получим:
поскольку 28 = 0102, 48 = 1002, 78 = 1112. Следует помнить, что восьмеричное число кодируется тремя битами, и выписывать триады нужно полностью. Исключением из этого правила может служить только старшая триада, в которой старший бит (СБ) равен нулю.
24738 = 101001110112 = 0101 0011 10112 = 53B16
Вывод целого отрицательного числа в шестнадцатеричной системе счисления
Как вывести дополнительный код hex целого отрицательного числа, вводимого в десятеричной системе счисления?
Отслеживать
задан 10 мар 2017 в 21:31
kall_lightman kall_lightman
45 1 1 серебряный знак 8 8 бронзовых знаков
Что именно вводится-то? Положительное число, дополнительный код отрицания которого надо построить? Отрицательное число? Если отрицательное число, то в каком коде оно внутренне представлено?
10 мар 2017 в 22:28
Вводится число -113, на экран должно выводится его дополнительный код в hex
12 мар 2017 в 15:26
1 ответ 1
Сортировка: Сброс на вариант по умолчанию
Если число вводится именно как отрицательное, то его представление в дополнительно коде совпадает с представлением этого же числа, приведенного к беззнаковому целому типу того же размера (при этом старший бит беззнакового представления соответствует знаковому биту знакового представления)
#include #include int main() < int i; std::cin >> i; std::make_unsigned_t u = i; std::cout
Однако спецификация поведения std::hex в данном контексте и так гарантирует (гарантирует ли?), что выводимое значение будет внутренне приведено к соответствующему беззнаковому типу, поэтому можно просто
int i; std::cin >> i; std::cout
(Эта часть вызывает у меня определенные сомнения. Лучше все-таки предварительно привести самостоятельно.)
Если же задача подразумевает, что надо сформировать представление в дополнительном коде числа -n для некоего вводимого положительного числа n , то делается это путем инверсии всех битов числа с последующим инкрементом результата
unsigned u; cin >> u; unsigned u2 = ~u + 1; std::cout
Представление положительных и отрицательных чисел в памяти компьютера. Прямой и дополнительный код числа
Прямой код – это представление числа в двоичной системе счисления, при котором первый (старший) разряд отводится под знак числа. Если число положительное, то в левый разряд записывается 0; если число отрицательное, то в левый разряд записывается 1.
Таким образом, в двоичной системе счисления, используя прямой код, в восьмиразрядной ячейке (байте) можно записать семиразрядное число. Например:
0 0001101 – положительное число
1 0001101 – отрицательное число
Количество значений, которые можно поместить в семиразрядной ячейке со знаком в дополнительном разряде равно 256. Это совпадает с количеством значений, которые можно поместить в восьмиразрядную ячейку без указания знака. Однако диапазон значений уже другой, ему принадлежат значения от -128 до 127 включительно (при переводе в десятичную систему счисления).
При этом в вычислительной технике прямой код используется почти исключительно для представления положительных чисел.
Для отрицательных чисел используется так называемый дополнительный код. Это связано с удобством выполнения операций над числами электронными устройствами компьютера.
Дополнительный код
В дополнительном коде, также как и прямом, первый разряд отводится для представления знака числа. Прямой код используется для представления положительных чисел, а дополнительный – для представления отрицательных. Поэтому, если в первом разряде находится 1, то мы имеем дело с дополнительным кодом и с отрицательным числом.
Все остальные разряды числа в дополнительном коде сначала инвертируются, т.е. заменяются противоположными (0 на 1, а 1 на 0). Например, если 1 0001100 – это прямой код числа, то при формировании его дополнительного кода, сначала надо заменить нули на единицы, а единицы на нули, кроме первого разряда. Получаем 1 1110011. Но это еще не окончательный вид дополнительного кода числа.
Далее следует прибавить единицу к получившемуся инверсией числу:
1 1110011 + 1 = 1 1110100
В итоге и получается число, которое принято называть дополнительным кодом числа.
Причина, по которой используется дополнительный код числа для представления отрицательных чисел, связана с тем, что так проще выполнять математические операции. Например, у нас два числа, представленных в прямом коде. Одно число положительное, другое – отрицательное и эти числа нужно сложить. Однако просто сложить их нельзя. Сначала компьютер должен определить, что это за числа. Выяснив, что одно число отрицательное, ему следует заменить операцию сложения операцией вычитания. Потом, машина должна определить, какое число больше по модулю, чтобы выяснить знак результата и определиться с тем, что из чего вычитать. В итоге, получается сложный алгоритм. Куда проще складывать числа, если отрицательные преобразованы в дополнительный код. Это можно увидеть на примерах ниже.
Операция сложения положительного числа и отрицательного числа, представленного в прямом коде
- Прямой код числа 5: 0 000 0101
Прямой код числа -7: 1 000 0111 - Два исходных числа сравниваются. В разряд знака результата записывается знак большего исходного числа.
- Если числа имеют разные знаки, то вместо операции сложения используется операция вычитания из большего по модулю значения меньшего. При этом первый (знаковый) разряд в операции не участвует.
_ 000 0111 000 0101 ------------- 000 0010
Операция сложения положительного числа и отрицательного числа, представленного в дополнительном коде
- Прямой код числа 5: 0 000 0101
Прямой код числа -7: 1 000 0111 - Формирование дополнительного кода числа -7.
Прямой код : 1 000 0111
Инверсия : 1 111 1000
Добавление единицы: 1 111 1001 - Операция сложения.
0 000 0101 + 1 111 1001 -------------- 1 111 1110
Как перевести отрицательное число в шестнадцатеричную систему
Регистрация: 11.06.2017
Сообщений: 4
Перевод отрицательных чисел из 10-й СС
Всем доброго времени суток. Я относительно недавно начал изучать самостоятельно C#. Как реализовать перевод отрицательных чисел из 10-й СС в 2-ю, 8-ю и 16-ю СС? Я уже реализовал перевод положительных чисел и это для меня понятно а вот как поступить с отрицательными не знаю.Свой код приложу в txt файле
Конвертер чисел.txt (1.8 Кб, 151 просмотров) |
Форумчанин
Регистрация: 23.01.2016
Сообщений: 608
Регистрация: 11.06.2017
Сообщений: 4
Я знаю как на бумаге переводить а вот как это преобразовать в код не знаю
Форумчанин
Регистрация: 09.05.2017
Сообщений: 716
И как на бумаге переводить?
Форумчанин
Регистрация: 23.01.2016
Сообщений: 608
Сообщение от Vlad_T
Я знаю как на бумаге переводить а вот как это преобразовать в код не знаю
чукча не читатель? Ткни по второй ссылке например, надо же готовый код/
Форумчанин
Регистрация: 09.05.2017
Сообщений: 716
Предполагаю, что переводить отрицательное десятичное число в шестнадцатеричное число надо так:
1) переводим отрицательное десятичное число в положительное десятичное число:
а) отнимаем 1;
б) инвертируем биты;
в) здесь получили результат - положительное десятичное число, флаг отрицательного числа тогда сохранили в отдельную переменную;
2) берем остаток от деления этого числа на 16 - это будет первый символ справа налево в искомом числе, заменяем это число на шестнадцатеричный эквивалент(0,1,2. 9,A,B,C,D,E,F) . Также необходимо отметить, что число на которое делится число, полученное в 1 пункте - это и есть система счисления, т.е. заменяя его мы можем просто заменить систему счисления того числа, которое хотим получить:D;
3) делим число на 16, смотрим, что получилось, если 0 - то выход, если какое-то число, то переходим к пункту 2 для следующего символа.
Ну как? Правильно?:D