Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Sys_Programming / ЛР1 / СистСч.doc
Скачиваний:
20
Добавлен:
20.02.2016
Размер:
128 Кб
Скачать

1.2.4. Числа со знаком.

Двоичные числа могут быть как со знаком (signed), так и без знака (unsigned).

Числа без знака используют все восемь битов для получения значения. Например, 11111111 = 255. Просуммировав значения всех битов, получим максимально возможное значение, которое может хранить байт без знака (255). Для слова без знака это значение будет составлять 65 535. Байт со знаком использует только 7 битов для получения значения, а старший восьмой бит зарезервирован для знака, при этом 0 соответствует положительному значению, а 1 – отрицательному. На представленном ниже рисунке 1.4 показано отображение положительного и отрицательного числа 10.

Знаковый бит

1

1

1

1

0

1

1

0

0

0

0

0

1

0

1

0

Рис.1.4 Отображение положительного

и отрицательного числа 10.

Дополнение до двух.

Чтобы не усложнять процессор, отдельный блок для реализации операции вычитания не делают, эту операцию выполняет блок суммирования. Но перед суммированием отрицательные числа преобразовываются в дополнительное число. Это такое число, которое в сумме с исходным числом дает 0. Например, десятичное –6 будет дополнительным для 6, так как 6 + 6 = 0. Таким образом, вместо операции вычитания

А-В процессор суммирует с положительным числом А дополнительное к В : А + (-В). Вместо того, чтобы вычесть 4 из 6, процессор просто складывает -4 и 6.

6 + - 4 = 2

Когда производится работа с двоичными числами, для дополнительного числа используется термин дополнение до двух (two’s complement). Также встречается такое определение, как двоичное дополнение. Например, для двоичного значения 0001 двоичным дополнением до двух будет 1111. Такое число получается из исходного числа после изменения всех единиц на нули, а нулей на единицы и прибавлением к получившемуся числу единицы:

N : 0001

Инвертированное N: 1110

Добавить 1: 1111

Если сложить N и дополнение до двух к N, то получим 0: 0001 + 1111 = 0000. Операция получения дополнения до двух полностью обратима. Например, для отрицательного числа -10 дополнением до двух будет 10:

1.2. Представление данных.

11110110 = -10

00001001 (Инверсия бит)

+ 00000001 (добавить 1)

00001010 = +10

Еще несколько примеров преобразования чисел (для дополнения до двух используем аббревиатуру NEG (n) ):

Десятичное Двоичное NEG (n) Десятичное

+2 00000010 11111110 -2

+16 00010000 11110000 -16

+127 01111111 10000001 -127

Операция инвертирования битов в двоичном числе обозначается NOT (n), а полученное значение называется дополнением до единицы или первичным дополнением. Поэтому двоичное дополнение может быть представлено выражением NOT (n) +1.

Максимальные и минимальные значения

Число со знаком из n разрядов может использовать только n-1 битов для получения значения. Например, знаковый байт использует только 7 битов (от 0 до 127). В табл. 1.8. показаны максимальные и минимальные значения для байтов, слов, двойных слов, и учетверенных слов со знаком. Наименьшие значения (-128, -32 768, -2 147 483 648 ) являются недопустимыми. Например, двоичное дополнение до ----128 (10000000) будет также 10000000.

Таблица 1.8. Целые числа со знаком и без знака.

Тип хранения

Биты

Диапазон (от -до)

Байт со знаком

7

От -128 до +127

Слово со знаком

15

От –32768 до +32767

Двойное слово со знаком

31

От –2147483648 до +2147483647

Учетверенное слово со знаком

63

От –9 223 372 036 854 775 808 до +9 223 372 036 854 775 807

Хотя процессор выполняет вычисления без учета знака числа, программист должен указывать знак операнда. Используя операнды со знаком, сложим +16 и –23 mov ax, +16

add ax, -23

В двоичном выражении число 16 будет выглядеть как 00010000, а -23 как 11101001. Когда процессор складывает эти числа, он получает 11111001. Это двоичное число соответсвует –7. Таким образом, сложение чисел со знаком будет корректным.

00010000 (16)

+11101001 (-23)

= 11111001 (-7)

Но в данном случае двоичное число можно интерпретировать и как десятичное число без знака 249. Поэтому программист должен отслеживать эти величины и четко понимать, какой тип имеет данное значение.

Соседние файлы в папке ЛР1