Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
МОП - лекции.docx
Скачиваний:
2
Добавлен:
01.05.2025
Размер:
293 Кб
Скачать
☆

Представление чисел в эвм

Все числа можно разделить на две категории:

  • Числа с фиксированной точкой

  • Числа с плавающей точкой

Представление чисел с фиксированной точкой

Числа с фиксированной точкой - положение 10-ой точки не изменяется. На практике так представляются целые числа. Для них ‘.’ Справа от наименьшего разряда.

Представление беззнаковых чисел соответствует обычной записи числа в двоичной СС. Диапазон зависит от количества разрядов:

(n- количество разрядов)

Знаковые числа представлены в ЭВМ в 3 видах:

  • В прямом коде

  • В обратном коде

  • В дополнительном коде

Для обозначения знака числа в этом коде используется специальный знак-разряд : 0 – для положительных и 1 – для отрицательных.

Знаковый разряд – всегда старший разряд числа.

11001010

Знак Значимая часть

Прямой код

Число представляется в виде абсолютного значения и кода знака

Недостаток прямого кода: 0 – представляется двумя способами

0 – положительный ноль – 0 0 ….

0 – отрицательный ноль = 1 0 0…

Пример

Записать числа 13 и -13 в прямом коде, использую 8 разрядов

|x|=1101

X=13 -> 0 0001101

X=-13 -> 1 0001101

Обратный код

Обратный код положительного числа – содержит 0 в знаковом разряде и модуль числа в остальных разрядах(совпадает с прямым кодом)

Для отрицательного числа – знаковый разряд содержит 1, а остальные разряды содержат инверсию модуля числа.(инвертированные биты)

[x]обр = |x| , x>=0 или 2^(n-1)-|x|,x<=0

Недостаток обратного кода: наличие двух нулей

[+0] = 0 000…

[-0] = 1 111…

Пример:

Запись числа 13 в обратном коде

|x|=1101

X=13

X=13 -> 0 0001101

X=-13 -> 1 1110010

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

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

Положительные числа совпадают с его прямым кодом.

Для отрицательного числа знаковый разряд содержит единицу, а остальные разряды содержат дополнение модуля числа, до 2^(n-1) или содержат код, который получается из обратного кода с прибавлением единицы в младший разряд.

[x]доп = |x|, x>=0 или 2^(n-1),x<0

Диапазон:

0 = 0 00000…

Пример: -13 в дополнительном коде:

-13 -> 1 1110011

Правило сложения в дополнительном коде:

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

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

Пример:

-13 -> 1 1110011

10 -> 0 0001010

Складываем:

11111101 = -3

11110011 = -13

00001110 = 14

Складываем: 0 0000001

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

Пример:

X=255 = 11111111

Unsigned : 0….0 11111111

Для знаковых чисел разряды расширения заполняются копией старшего разряда расширяемого числа

Signed: 1….1 11111111 = -128

Полезные приёмы при работе с целыми числами: 1 приём - умножение целого числа на const при помощи сдвигов.

Сдвиг, как знаковых, так и без знаковых чисел, влево на n разрядов приводит к умножению числа на 2^n. Если переменную V необходимо умножить на const C , то эту константу можно представить как сумму степеней двоек. И умножение заменить суммой сдвигов числа V. Такое действие будет гораздо быстрее, чем умножение.

Пример:

V = V*25

C = 25 = 16 + 8 +1 = 2^4 + 2^3 + 2^0

V+25=V*(16 + 8 + 1) = V*2^4 + V*2^3 + V*2^0 = (V<<4) + (V<<2) + V

2 приём – деление целого числа на 2^n при помощи сдвигов.

Сдвиг как без знаковых, так и знаковых чисел вправо на n разрядов, приводит к делению числа на 2^n.

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

10010011 делим на 4 (сдвигаем на 2 разряда) получаем: 00100100

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

Если знаковое: 10010011 делим на 4 = 11100100

Недостаток деления посредством сдвигов : нельзя const разделить на степени двойки.