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

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

Двоичное 8-ми разрядное число со знаком в дополнительном коде может представлять любое целое в диапазоне от −128 до +127.

Прямой код числа.
Представление числа в привычной форме "знак"-"величина", при которой старший разряд ячейки отводится под знак, а остальные - под запись числа в двоичной системе, называется прямым кодом двоичного числа. Например, прямой код двоичных чисел 1001 и -1001 для 8-разрядной ячейки равен 00001001 и 10001001 соответственно.
Положительные числа в ЭВМ всегда представляются с помощью прямого кода. Прямой код числа полностью совпадает с записью самого числа в ячейке машины. Прямой код отрицательного числа отличается от прямого кода соответствующего положительного числа лишь содержимым знакового разряда. Но отрицательные целые числа не представляются в ЭВМ с помощью прямого кода, для их представления используется так называемый дополнительный код.

Дополнительный код числа.
Дополнительный код положительного числа равен прямому коду этого числа. Дополнительный код отрицательного числа m равен 2k-|m|, где k - количество разрядов в ячейке.
Как уже было сказано, при представлении неотрицательных чисел в беззнаковом формате все разряды ячейки отводятся под само число. Например, запись числа 243=11110011 в одном байте при беззнаковом представлении будет выглядеть следующим образом:


При представлении целых чисел со знаком старший (левый) разряд отводится под знак числа, и под собственно число остаётся на один разряд меньше. Поэтому, если приведённое выше состояние ячейки рассматривать как запись целого числа со знаком, то для компьютера в этой ячейке записано число -13 (243+13=256=28).
Но если это же отрицательное число записать в ячейку из 16-ти разрядов, то содержимое ячейки будет следующим:

Знаковый разряд
Возникает вопрос: с какой целью отрицательные числа записываются в виде дополнительного кода и как получить дополнительный код отрицательного числа?
Дополнительный код используется для упрощения выполнения арифметических операций. Если бы вычислительная машина работала с прямыми кодами положительных и отрицательных чисел, то при выполнении арифметических операций следовало бы выполнять ряд дополнительных действий. Например, при сложении нужно было бы проверять знаки обоих операндов и определять знак результата. Если знаки одинаковые, то вычисляется сумма операндов и ей присваивается тот же знак. Если знаки разные, то из большего по абсолютной величине числа вычитается меньшее и результату присваивается знак большего числа. То есть при таком представлении чисел (в виде только прямого кода), операция сложения реализуется через достаточно сложный алгоритм. Если же отрицательные числа представлять в виде дополнительного кода, то операция сложения, в том числе и разного знака, сводится к их поразрядному сложению.



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

Алгоритм получения дополнительного кода отрицательного числа.
Для получения дополнительного k-разрядного кода отрицательного числа необходимо

  1. модуль отрицательного числа представить прямым кодом в k двоичных разрядах;
  2. значение всех бит инвертировать: все нули заменить на единицы, а единицы на нули(таким образом, получается k-разрядный обратный код исходного числа);
  3. к полученному обратному коду прибавить единицу.

    Пример:
    Получим 8-разрядный дополнительный код числа -52:

00110100 - число |-52|=52 в прямом коде

11001011 - число -52 в обратном коде

11001100 - число -52 в дополнительном коде
Можно заметить, что представление целого числа не очень удобно изображать в двоичной системе, поэтому часто используют шестнадцатеричное представление:

1100 1100

С С

но 27 − 1, что равно 127.

Вопрос №27

Представление чисел в форме с фиксированной и плавающей запятой. Арифметические операции над числами с фиксированной и плавающей запятой.

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

Однако целый ряд машин работает с числами в этих двух форматах.

В общем виде способ представления чисел сильно влияет на характер программирования. Так, программирование для ЭВМ, работающих в системе с фиксированной запятой, значительно усложняется, поскольку помимо алгоритмических трудностей этот процесс требует ещё отслеживания положения запятой.

Фиксированная запятая

Оговоримся, что разрядная сетка машины имеет постоянное число разрядов - n.

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

|X| < 1

Введём две характеристики чисел: диапазон изменения и точность представления.

Диапазон изменения характеризуется теми пределами, в которых могут находиться числа, с которыми оперирует машина.

Отличное от нуля самое малое число:

Таким образом, диапазон чисел, с которыми работает ЭВМ, есть:

|X|min |X| |X|max

2-n |X| 1 - 2-n

Иными словами, числа, которые выходят за диапазон изменения, в ЭВМ не могут быть представлены точно. Если

|X| < |X|min = 2-n,

то такое число воспринимается как нуль.

Если:

|X| > |X|max = 1- 2-n,

то такое число воспринимается как бесконечно большое. Этим двум случаям соответствуют понятия машинного нуля и машинной бесконечности.

При оптимальном округлении абсолютная ошибка:

|ΔX| 0,5*2-n

Минимальная относительная ошибка:

|ΔX| 0,5*2-n

| x|min = _______ = -__________ 2-(n+1)

|X|max 1-2-n

так как 1-2-n 1 при большом "n"

Максимальная относительная ошибка:

|ΔX| 0,5*2-n

| X|max = _____ = _____________ = 0,5

|X|min 2-n

Ошибка представления числа зависит от величины самого числа и способа округления:

2-(n+1) | X| 0,5

Заметим, что для малых чисел ошибка может достигать большой величины.

Плавающая запятая

В ЭВМ с плавающей запятой число представляется в виде:

X = ± Mx * q±p,

где: Mx - мантисса числа;

q - основание системы счисления;

p - порядок.

Разрядная сетка машины принимает следующий вид:

Это лишь условное изображение основных слогов в числе. Заметим, что в реальной ЭВМ может быть принят любой другой порядок расположения.

Пусть "m" разрядов отведено под изображение мантиссы, а "k" разрядов под изображение порядка. Тогда для двоичной системы и нормализованного вида числа:

q = 2;

0,1 Mx < 1 - нормализованная мантисса.

То есть диапазон чисел:

Абсолютная ошибка представления числа в ЭВМ с плавающей запятой равна:

|ΔX| 0,5*2-m

Так как

2-1 |Mx| 1-2-m,

то минимальная относительная ошибка:

|ΔX|min = (0,5*2-m) / (1 - 2-m) 2-(m+1), при m - большом,

а максимальная относительная ошибка:

|ΔX|max =(0,5*2-m) / (2-1) = 2-m

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

Теоретически "плавающая запятая" имеет преимущества перед "фиксированной". Но соответствующее устройство получается намного сложнее. К тому же специфика выполнения операций с плавающей запятой требует большего числа микроопераций, что приводит к снижению быстродействия ЭВМ. Однако "плавающая запятая" снимает с программиста обязанность отслеживать положение запятой в вычислениях и значительно упрощает сам процесс программирования вычислительных задач.




7827011577522300.html
7827069903098185.html
    PR.RU™