Представление положительных и отрицательных чисел в памяти компьютера. Прямой и дополнительный код числа
Прямой код
Прямой код – это представление числа в двоичной системе счисления, при котором первый (старший) разряд отводится под знак числа. Если число положительное, то в левый разряд записывается 0; если число отрицательное, то в левый разряд записывается 1.
Таким образом, в двоичной системе счисления, используя прямой код, в восьмиразрядной ячейке (байте) можно записать семиразрядное число. Например:
0 0001101 – положительное число
1 0001101 – отрицательное число
При этом в вычислительной технике прямой код используется почти исключительно для представления положительных чисел.
Для отрицательных чисел используется так называемый дополнительный код. Это связано с удобством выполнения операций над числами электронными устройствами компьютера.
Дополнительный код
В дополнительном коде, также как и прямом, первый разряд отводится для представления знака числа. Прямой код используется для представления положительных чисел, а дополнительный – для представления отрицательных. Поэтому, если в первом разряде находится 1, то мы имеем дело с дополнительным кодом и с отрицательным числом.
Все остальные разряды числа в дополнительном коде сначала инвертируются, т.е. заменяются противоположными (0 на 1, а 1 на 0). Например, если 1 0001100 – это прямой код числа, то при формировании его дополнительного кода, сначала надо заменить нули на единицы, а единицы на нули, кроме первого разряда. Получаем 1 1110011. Но это еще не окончательный вид дополнительного кода числа.
Далее следует прибавить единицу к получившемуся инверсией числу:
1 1110011 + 1 = 1 1110100
В итоге и получается число, которое принято называть дополнительным кодом числа.
Причина, по которой используется дополнительный код числа для представления отрицательных чисел, связана с тем, что так проще выполнять математические операции. Например, у нас два числа, представленных в прямом коде. Одно число положительное, другое – отрицательное и эти числа нужно сложить. Однако просто сложить их нельзя. Сначала компьютер должен определить, что это за числа. Выяснив, что одно число отрицательное, ему следует заменить операцию сложения операцией вычитания. Потом, машина должна определить, какое число больше по модулю, чтобы выяснить знак результата и определиться с тем, что из чего вычитать. В итоге, получается сложный алгоритм. Куда проще складывать числа, если отрицательные преобразованы в дополнительный код. Это можно увидеть на примерах ниже.
Представление отрицательных чисел в двоичной системе счисления
Положительные числа нами были рассмотрены ранее. Рассмотрим способы представления отрицательных чисел в двоичном коде. Существует несколько способов такого представления. Мы рассмотрим три:
Старший бит младший бит
Если бит-знак равен 0, то число считается положительным, а если бит-знак равен 1 = отрицательным.
Недостатком прямого кода является невозможность выполнения арифметических операций.
Рассмотрим сложение: 12+(-12)=0
Числа здесь представляются так:
Число в смещенном коде | Двоичный код | Число без знака |
………. | ……… | ..……. |
-1 | ||
………. | ………. | ……… |
-127 | ||
-128 |
Достоинством данной системы является то, что в ней выполняются арифметические операции, правда с учетом коррекции результата. А недостатком является то, что 0 соответствует числу 128.
Рассмотрим сложение: 12+(-12)=0
Как видим, в результате операции получилось число 256. Ограничив предел рассмотрения одним байтом, получим 00000000, к этому результату надо прибавить смещение 128.
Рассмотрим сложение: 12+(-13)=0
Как видим, и в данном случае к результату необходимо прибавить 128 и ограничить рассмотрение одним байтом.
1. запишем число без знака: 9;
2. преобразуем число в двоичный код: 00001001;
3. получим обратный код: 11110110;
4. прибавим 00000001 и получим: 11110111.
Если результат операции представлен в дополнительном коде, то для перевода его в десятичный вид используем нижеследующую процедуру
1. запишем дополнительный код: 11110111;
2. получим обратный код: 00001000;
3. прибавим 00000001: 00001001;
Знак минус мы добавили, так как знаем, что наше исходное число в дополнительном коде отрицательное (старший бит равен 1)
Рассмотрим таблицу соответствия чисел представленных в дополнительном коде.
Число со знаком | Двоичный код | Число без знака |
+127 | ||
………………………. | ………………………… | ………………………… |
+2 | ||
+1 | ||
+0 | ||
-1 | ||
-2 | ||
-3 | ||
………………………. | ………………………… | ………………………… |
-128 |
В дополнительном коде сохраняются все правила выполнения арифметических операций.
Дата добавления: 2014-01-07 ; Просмотров: 9056 ; Нарушение авторских прав?
Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет
Способы перевода чисел из одной системы счисления в другую
Сдающим ЕГЭ и не только…
Странно, что в школах на уроках информатики обычно показывают ученикам самый сложный и неудобный способ перевода чисел из одной системы в другую. Это способ заключается в последовательном делении исходного числа на основание и сборе остатков от деления в обратном порядке.
Например, нужно перевести число 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. Нам нужно разложить это число на слагаемые, равные степеням двойки.
Способ 2: Распишем слагаемые как степени двойки друг под другом, начиная с большего.
Вот и всё. Попутно также просто решается задача «сколько единиц в двоичной записи числа 810?».
Ответ — столько, сколько слагаемых (степеней двойки) в таком его представлении. У 810 их 5.
Теперь пример попроще.
Ну и, наконец, совсем лёгкие переводы между 8- и 16-ричными системами. Так как их основанием является степень двойки, то перевод делается автоматически, просто заменой цифр на их двоичное представление. Для 8-ричной системы каждая цифра заменяется тремя двоичными разрядами, а для 16-ричной четырьмя. При этом все ведущие нули обязательны, кроме самого старшего разряда.
Переведем в двоичную систему число 5478.
5478= | 101 | 100 | 111 |
5 | 4 | 7 |
Ещё одно, например 7D6A16.
7D6A16= | (0)111 | 1101 | 0110 | 1010 |
7 | D | 6 | A |
Перевод отрицательных чисел
Здесь нужно учесть, что число будет представлено в дополнительном коде. Для перевода числа в дополнительный код нужно знать конечный размер числа, то есть во что мы хотим его вписать — в байт, в два байта, в четыре. Старший разряд числа означает знак. Если там 0, то число положительное, если 1, то отрицательное. Слева число дополняется знаковым разрядом. Беззнаковые (unsigned) числа мы не рассматриваем, они всегда положительные, а старший разряд в них используется как информационный.
Для перевода отрицательного числа в двоичный дополнительный код нужно перевести положительное число в двоичную систему, потом поменять нули на единицы и единицы на нули. Затем прибавить к результату 1.
Перевод дробных чисел
Дробные числа переводятся способом, обратным делению целых чисел на основание, который мы рассмотрели в самом начале. То есть при помощи последовательного умножения на новое основание с собиранием целых частей. Полученные при умножении целые части собираются, но не участвуют в следующих операциях. Умножаются только дробные. Если исходное число больше 1, то целая и дробная части переводятся отдельно, потом склеиваются.
Переведем число 0,6752 в двоичную систему.
0 | ,6752 |
*2 | |
1 | ,3504 |
*2 | |
0 | ,7008 |
*2 | |
1 | ,4016 |
*2 | |
0 | ,8032 |
*2 | |
1 | ,6064 |
*2 | |
1 | ,2128 |
Процесс можно продолжать долго, пока не получим все нули в дробной части или будет достигнута требуемая точность. Остановимся пока на 6-м знаке.