Для представления как положительных так и отрицательных чисел используется так называемый дополнительный код – наиболее распространенный способ представления отрицательных целых чисел в компьютерах. Основным достоинством дополнительного кода является то, что в нем единообразно реализуются операции сложения чисел разных знаков (алгебраическое сложение), а операцию вычитания можно свести к операции сложения заменой знака вычитаемого на обратный. Дополнительный код отрицательного числа получается инвертированием двоичного числа и прибавлением к нему единицы (поэтому он и называется дополнительным).
Чтобы увидеть, как получается отрицательное число в дополнительном коде, вычтем из нуля единицу. Вычитание будем производить используя восьмиразрядную решетку:
| b | |||||||||
b | ||||||||||
b |
Мы получили число -1 в двоичном дополнительном коде. Чтобы убедится, что это в самом деле -1, сложим это число с 1:
| b | |||||||||
b | ||||||||||
b |
Как и следовало ожидать мы снова получили 0.
При записи числа в дополнительном коде старший разряд является знаковым. Если его значение равно 0, то в остальных разрядах записано положительное двоичное число. Если же знаковый разряд равен 1, то в остальных разрядах записано отрицательное двоичное число, преобразованное в дополнительный код.
Посмотрим, как представляется первые последовательные числа при переходе через ноль (для чисел записанных в восьмиразрядную решетку):
0000 0000 | |
-1 | 1111 1111 |
-2 | 1111 1110 |
-3 | 1111 1101 |
-4 | 1111 1100 |
-5 | 1111 1011 |
Для получения значения отрицательного числа все разряды инвертируются, а к результату добавляется единица. Обратное преобразование, то есть перевод из дополнительного в прямой код, осуществляется аналогично.
Получим отрицательное число −5, записанное в дополнительном коде.
Запишем 5 в двоичном виде, дописывая недостающие нули слева:
0000 0101
Инвертируем все разряды числа, получая таким образом обратный код:
1111 1010
Добавим к результату 1, получим искомый результат (−5 в дополнительном коде)
1111 1010 + 1 = 1111 1011
Для обратного преобразования используется тот же алгоритм. А именно:
Инвертируем все разряды числа
0000 0100
Добавим к результату 1 и получим снова положительное число 5
0000 0100 + 1 = 0000 0101
Числа с плавающей запятой (точкой)
В форме с плавающей запятой число представляется двумя компонентами: мантиссой и порядком. Мантисса используется для записи цифр числа, а порядок – для указания положения запятой.
Разрядная сетка машины в этом случае делится на несколько частей:
- один разряд – для кодирования знака числа (это всегда самый старший, левый, разряд слова);
- M разрядов – для записи мантиссы;
- Р разрядов – для записи порядка (с учетом его знака).
Местоположение запятой при этом тоже строго фиксируется: считается, что мантисса всегда представляется как число, меньшее единицы, но такое, в котором первая цифра после запятой для всех абсолютно чисел отлична от нуля (единственное исключение составляет число 0). Такая форма представления мантиссы называется нормализованной. Иначе говорят, что мантисса нормализована (приведена к виду: 1 < M <= 0,1).
Итак, число в форме с плавающей запятой представляется последовательностью битов без каких либо явно указанных разделителей, но функционально разбитой на три группы (знак числа, мантисса числа, порядок числа).
Рассмотренная форма кодирования числа приводит к следующим последствиям:
- Диапазон чисел, представимых в форме с плавающей запятой, определяется главным образом разрядностью порядка (Р).
- Разрядность мантиссы (М) определяет точное количество значащих цифр в изображении числа.
… | … |
|
| ||||
Покажем на примерах, как записываются некоторые числа в нормализованном виде в четырехбайтовом формате с семью разрядами для записи порядка.
Число 6.25
Преобразуем в двоичный вид
|
|
Нормализуем, т.е. записываем в виде M * 2p, где 1 < M <= 0,1. Для нашего случая первую часть выражения (мантиссу) умножаем на 2-5, а вторую на 25
11001b*2-2 = 11001b * 2-5 *2-2 * 25 = 0.11001b*23 = 0.11001b*211b
Выпишем представление числа в памяти.
31 | 30 | 29 | 28 | 27 | 26 | 25 | 24 | 23 | 22 | 21 | 20 | 19 | 18 | 17 | 16 | 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
0 | 1 |
| |||
Число –0.125
|
|
Нормализуем
–1*2-3 = –0.1*2-2
Отрицательный порядок записываем в дополнительном коде:
–0.1*2-2 = –0.1*2111111101
Теперь размещаем число в нашем четырехбайтовом формате
31 | 30 | 29 | 28 | 27 | 26 | 25 | 24 | 23 | 22 | 21 | 20 | 19 | 18 | 17 | 16 | 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
1 | 1 |
| |||