Главная /
Ассемблер /
Для чайников /
Введение /
Представление данных /
Отрицательные числа
Мы разобрались, как в памяти компьютера представлены
положительные числа,
то есть числа без знака. Но ведь числа бывают и отрицательными, то есть числа со знаком минус.
Чтобы применять те же самые байты и слова для представления отрицательных чисел,
существует специальная операция, которая называется
дополнение до двух. Но прежде чем рассмотреть эту операцию, покажем,
как отрицательное число отличить от положительного.
Для того чтобы указать знак числа, достаточно одного разряда (бита). Обычно знаковый бит
занимает старший разряд числа. Если старший бит числа равен 0, то число считается положительным.
Если старший разряд числа равен 1, то число считается отрицательным. Пример байта со знаком
приведён на рис. 2.3.
Разряды |
Число |
7 |
6 |
5 |
4 |
3 |
2 |
1 |
0 |
1 |
0 |
0 |
1 |
0 |
0 |
1 |
0 |
-110 |
0 |
1 |
1 |
0 |
1 |
1 |
1 |
0 |
+110 |
Рис. 2.3. Отрицательное число в памяти компьютера.
Как вы успели заметить, для представления числа со знаком требуется использовать старший
бит для определения знака числа. Это означает, что этот старший бит уже нельзя
использовать для записи самого числа, то есть максимальное значение, которое мы сможем
записать в байт, будет уже не 255, а всего 127. Диапазоны возможных значений чисел
со знаком приведены в таблице 2.5.
Таблица 2.5. Диапазоны возможных значений чисел со знаком.
Тип числа |
Диапазон значений |
Степени двойки |
Байт |
–128…+127 |
-27…(27 – 1) |
Слово |
–32 768…+32 767 |
-215…(215 – 1) |
Двойное слово |
–2 147 483 648… +2 147 483 647 |
-231…(231 – 1) |
Учетверённое слово |
–9 223 372 036 854 775 808… +9 223 372 036 854 775 807 |
-263…(263 – 1) |
А теперь разберёмся с загадочной операцией дополнение до двух.
Для изменения знака числа выполняется инверсия, то есть для числа
в двоичном представлении все нули заменяются единицами, а все единицы – нулями.
Затем к полученному результату прибавляют 1. Возьмём, например, десятичное число 110
(в двоичной системе это число 01101110). Тогда
Исходное число |
0110 |
1110 |
Инверсия |
1001 |
0001 |
Прибавляем 1 |
1001 |
0010 |
Как видим, после выполнения этих преобразований в старшем разряде у нас 1,
то есть число отрицательное. А теперь проверим, что это число действительно отрицательное.
Как это сделать? Вспомним, что (–110 + 110 = 0). То есть сложение полученных нами
двоичных чисел тоже должно дать в результате ноль. Итак
01101110
+
10010010
=
100000000
То есть у нас получилось девятиразрядное число 100000000 (десятичное 256).
Однако мы работаем с байтом, а в байте, как известно, только 8 бит (от 0 до 7).
То есть единица у нас перешла в 8-й бит, которого в байте попросту нет. То есть для
байта это эквивалентно числу 0.
В некоторых источниках дополнение до двух носит название двоичный дополнительный код.
Подведём итоги
Преобразования положительного десятичного числа со знаком в двоичное число выполняется
также как и для чисел без знака.
Преобразования отрицательного десятичного числа со знаком в отрицательное двоичное
число выполняется при помощи операции дополнение до двух (с использованием двоичного
дополнительного кода). То есть сначала число преобразовывается в двоичное,
а потом используется двоичный дополнительный код.
Преобразования положительного двоичного числа со знаком (в старшем бите 0) в десятичное
число выполняется также как и для чисел без знака.
Преобразование отрицательного двоичного числа (в старшем бите 1) в десятичное число
выполняется путём нахождения его дополнительного кода. То есть для двоичного числа 10010010
операция будет следующей:
Исходное число |
1001 |
0010 |
Инверсия |
0110 |
1101 |
Прибавляем 1 |
0110 |
1110 |
В итоге получаем число 110, но поскольку в исходном числе старший бит был равен 1,
то это отрицательное число, то есть –110.