Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Информатика.doc
Скачиваний:
4
Добавлен:
26.09.2019
Размер:
270.34 Кб
Скачать

Представление двоичных чисел в прямом, обратном и дополнительных кодах.

Обратные и дополнительные коды используются для замены вычитания сложением. Эти коды используются для представления двоичных чисел. Десятичные – только для иллюстрации. Представление положительных чисел во всех кодах совпадает.

Прямой код.

Число преобразуется в прямой код по правилу:

x > 0, x = +0, x1, x2, …, то [x]пр = 0, х1, х2, …

х < 0, х = -0, х1, х2, …, то [x]пр = 1, х1, х2, …

Если в разряде знака 0 – число положительное, если 1 – число отрицательное.

Пример:

х = -0.10101  [x]пр = 1.10101

Обратный код:

Число преобразуется в обратный код по правилу:

x > 0, x = +0, x1, x2, …, то [x]обр = [x]пр = х

х < 0, х = -0, х1, х2, …, то 1.{01, 10}

Пример:

х = -0.10101

[x]обр = 1.01010

Дополнительный код:

x > 0, x = +0, x1, x2, …, то [x]доп = [x]пр = [x]обр = х

х < 0, х = -0, х1, х2, …, то [x]доп определяется как дополнение числа до единицы более старшего разряда; [x]доп = 1.х1|x2|…+0,00…1

Пример:

х = -0.10101

Берется число 100000 и из него вычитается мантисса 10101. Полученное число является дополнением. В этом примере дополнение 01011.

Пример:

5(10) – 3(10) = 2(10)

Для десятичных чисел.

Дополнение 3 до 10  7 (10 – 3 = 7)

5 + 7 = 12  1|2

В обратном коде для десятичных чисел при представлении каждой позиции используются цифры от 0 до 9. Инвертированное число для 3 равно 6 (9 – 3 = 6), поэтому

5 + 6 = 11

Единица переноса добавляется к младшему разряду и получается в итоге 2.

12 – 3 = 9

1100

Сложение двоичных чисел в компьютере. Модифицированный код.

С учетом знаков сложение чисел в компьютере выполняется следующим образом. Числа в прямом коде преобразуются в дополнительный или обратный, выполняется поразрядное сложение кодов, и результат преобразуется в прямой код для передачи на другие устройства компьютера.

Сложение в обратном коде.

Число в обратном коде складывается поразрядно, включая знаковые разряды. При возникновении в знаковом разряде единицы переноса, она прибавляется к младшему разряду, что называется циклическим переносом.

При сложении различают четыре случая:

1. При сложении двух положительных чисел получают положительное число.

2. При сложении положительного и отрицательного чисел получают отрицательное число.

3. При сложении положительного и отрицательного чисел получают положительное число.

4. При сложении двух отрицательных чисел получают отрицательное число.

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

Модифицированный обратный код.

При сложении больших чисел возможно переполнение разрядной сетки компьютера. При этом в знаковом разряде при сложении двух положительных чисел может появиться единица, что означает отрицательный результат.

Пример:

0.1010 + 0.1101 = 1.0111 (неверно)

Для выявления переполнения вводится модифицированный обратный код. В модифицированном коде под знак числа отводится два разряда, а не один. В модифицированном обратном коде числа представляются по правилу:

x > 0, x = +0, x1, x2, …, то [x]обр. мод. = 00, x1, x2, …

х < 0, х = -0, х1, х2, …, то [x]обр. мод. = 11, |x1, |x2, …

Остальные комбинации знаковых разрядов (01, 10) служат признаком переполнения разрядной сетки компьютера.

При сложении два знаковых разряда сравниваются между собой и при появлении переполнения, компьютер останавливается с сообщением об ошибке. В модифицированном обратном коде числа складываются как и в обычном обратном коде.

Сложение в дополнительном коде.

В дополнительном коде числа складываются так же, как и в обратном, только единица переноса, получающаяся при сложении, отбрасывается.

Пример:

- 0,0101 + 0,1010

0,0101  1,1011доп

0,1010 + 1,1011 = |1|0,0101доп

Модифицированный дополнительный код.

В модифицированном дополнительном коде так же, как и в обратном, под знак числа отводится два разряда. В модифицированном дополнительном коде числа представляются по правилу:

x > 0, x = +0, x1, x2, …, то [x]доп. мод. = 00, x1, x2, …

х < 0, х = -0, х1, х2, …, то [x]доп. мод. = 11, |x1, |x2, … + 0,0…1

Как и в обратном коде, комбинация знаковых разрядов (01 и 10) являются признаком переполнения разрядной сетки.

04.05.2012 г. (пт)

Таблица «Способы преобразования символов при вводе».

Символ за %

Тип, ожидаемый при вводе

Тип аргумента

d

Десятичное целое

Указатель на int

D

Десятичное целое

Указатель на long int

o

Восьмеричное целое

Указатель на int

O

Восьмеричное целое

Указатель на long int

x, X

Шестнадцатеричное целое

Указатель на int

i

Десятичное, восьмеричное или шестнадцатеричное целое

Указатель на int

I

Десятичное, восьмеричное или шестнадцатеричное целое

Указатель на long int

u

Десятичное целое без знака

Указатель на

unsigned int

U

Десятичное целое без знака

Указатель на

unsigned long int

e, E, f, g, G

Величина с плавающей точкой, состоящая из мантиссы и порядка

Указатель на float

c

Символ. Символы пробелов (и подобные), которые обычно пропускаются, но считываются, если есть символ с

Указатель на char

s

Символьная строка

Указатель на символьный массив, достаточно большой, чтобы разместить вводимое поле и завершающий null-символ, добавляемый автоматически

%

Символ %

Не преобразуется, участвует во вводе, как символ %

n

Из потока ничего не считывается

Указатель на переменную типа int, в которую записывается количество символов, считанных из потока, вплоть до этой точки при текущем вызове функции

p

Величина в виде XXXX:YYYY, где X и Y являются шестнадцатеричными цифрами верхнего регистра

Указатель на объект (far* или near*)

%p выполняет преобразование требуемого указателя, используя модели памяти

Из рассмотренного выше программного примера следует, что в общем случае структура формата имеет вид:

%[*][ширина][префикс]тип

[*] после % подавляет запоминание следующего вводимого поля. Поле считывается в соответствии с форматом, но преобразованная величина никуда не записывается.

[ширина] – это положительное десятичное целое, задающее максимальное число символов при вводе. Если [ширина] избыточная, то чтение происходит до пробельного символа. Если [ширина] меньше, чем число символов до пробельного, то читаются и преобразуются только символы, числом не более [ширина].

При этом, [префиксами] могут быть:

N – используется для печати адресов. near (формат %Np)

F – используется для печати адресов. far (формат %Fp)

H – используется для ввода коротких целых с типом short.

L – используется для ввода длинных целых и вещественных с типом long.

Отметим, что scanf и fscanf идентичны, но вместо потока, заданного первым аргументом, она по умолчанию использует предопределенный входной поток stdin, поэтому в вызове функции scanf список аргументов начинается сразу с управляющей строки.