Дополнение б – представление чисел

Содержание

Дополнение б – представление чисел

Целые числа являются простейшими числовыми данными, с которыми оперирует ЭВМ. Для целых чисел существуют два представления: беззнаковое (только для неотрицательных целых чисел) и со знаком. Очевидно, что отрицательные числа можно представлять только в знаковом виде. Целые числа в компьютере хранятся в формате с фиксированной запятой.

Представление целых чисел в беззнаковых целых типах.

Представление целых чисел в знаковых целых типах.

Прямой код числа.

Дополнительный код числа.


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

111111

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

11111111111111

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

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

Алгоритм получения дополнительного кода отрицательного числа.


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

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

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

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

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

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

Нормализованная запись числа.


Нормализованная запись отличного от нуля действительного числа – это запись вида a= m*P q , где q – целое число (положительное, отрицательное или ноль), а m – правильная P-ичная дробь, у которой первая цифра после запятой не равна нулю, то есть . При этом m называется мантиссой числа, q – порядком числа.

Примеры:

  1. 3,1415926 = 0, 31415926 * 10 1 ;
  2. 1000=0,1 * 10 4 ;
  3. 0,123456789 = 0,123456789 * 10 0 ;
  4. 0,00001078 = 0,1078 * 8 -4 ; (порядок записан в 10-й системе)
  5. 1000,00012 = 0, 100000012 * 2 4 .

Так как число ноль не может быть записано в нормализованной форме в том виде, в каком она была определена, то считаем, что нормализованная запись нуля в 10-й системе будет такой:
0 = 0,0 * 10 0 .

Нормализованная экспоненциальная запись числа – это запись вида a= m*P q , где q – целое число (положительное, отрицательное или ноль), а m – P-ичная дробь, у которой целая часть состоит из одной цифры. При этом (m-целая часть) называется мантиссой числа, q – порядком числа.

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


При представлении чисел с плавающей запятой часть разрядов ячейки отводится для записи порядка числа, остальные разряды – для записи мантиссы. По одному разряду в каждой группе отводится для изображения знака порядка и знака мантиссы. Для того, чтобы не хранить знак порядка, был придуман так называемый смещённый порядок, который рассчитывается по формуле 2 a-1 +ИП, где a – количество разрядов, отводимых под порядок.

Пример:
Если истинный порядок равен -5, тогда смещённый порядок для 4-байтового числа будет равен 127-5=122.

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

  1. Перевести число из p-ичной системы счисления в двоичную;
  2. представить двоичное число в нормализованной экспоненциальной форме;
  3. рассчитать смещённый порядок числа;
  4. разместить знак, порядок и мантиссу в соответствующие разряды сетки.

Пример:
Представить число -25,625 в машинном виде с использованием 4 байтового представления (где 1 бит отводится под знак числа, 8 бит – под смещённый порядок, остальные биты – под мантиссу).

2510=1000112
0,62510=0,1012
-25,62510= -100011,1012
2. -100011,1012 = -1,000111012 * 2 4
3. СП=127+4=131
4.

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


Окончательный ответ: C1CD0000.

Прямой, дополнительный и обратный коды

Прямой, дополнительный и обратный код числа (создан по запросу).

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

Обновление: Из комментариев становится ясно, что люди не вполне понимают, что делает этот калькулятор. Точнее, что делал — применял алгоритм вычисления дополнительного кода к любому числу. Люди хотят, чтобы он им просто показывал дополнительный код числа. Ну хорошо — теперь при вводе положительного числа калькулятор показывает представление числа в двоичной форме, ибо для него нет обратного и дополнительного кода, а при вводе отрицательного показывает дополнительный и обратный код.

Прямой, дополнительный и обратный код

Прямой код числа это представление беззнакового двоичного числа. Если речь идет о машинной арифметике, то как правило на представление числа отводится определенное ограниченное число разрядов. Диапазон чисел, который можно представить числом разрядов n равен

Обратный код числа, или дополнение до единицы (one’s complement) это инвертирование прямого кода (поэтому его еще называют инверсный код). То есть все нули заменяются на единицы, а единицы на нули.

Дополнительный код числа, или дополнение до двойки (two’s complement) это обратный код, к младшему значащему разряду которого прибавлена единица

А теперь «зачем, зачем это все?» ©

А это все для удобной работы со знаками. Поскольку я все люблю понимать на примерах, рассказывать я тоже буду на примерах. Итак, предположим, что у нас 4 разряда для работы с двоичными числами. Представить таким образом можно 16 чисел — 0, 1, . 15
00 — 0000
.
15 — 1111

Но если нет знака, убогая получается арифметика. Нужно вводить знак. Чтобы никого не обидеть, половину диапазона отдадим положительным числам (8 чисел), половину — отрицательным (тоже 8 чисел). Ноль, что отличает машинную арифметику от обычной, мы отнесем в положительные числа (в обычной арифметике у нуля нет знака, если не ошибаюсь). Итого, в положительные числа попадают 0. 7, а в отрицательные -1, . -8.

Для различия положительных и отрицательных чисел выделяют старший разряд числа, который называется знаковым (sign bit)
0 в этом разряде говорит нам о том, что это положительное число, а 1 — отрицательное.

С положительными числами все вроде бы понятно, для их представления можно использовать прямой код
0 — 0000
1 — 0001
7 — 0111

А как представить отрицательные числа?

Вот для их представления как раз и используется дополнительный код.
То есть, -7 в дополнительном коде получается так
прямой код 7 = 0111
обратный код 7 = 1000
дополнительный код 7 = 1001

Обратим внимание на то, что прямой код 1001 представляет число 9, которое отстоит от числа -7 ровно на 16, или .
Или, что тоже самое, дополнительный код числа “дополняет” прямой код до , т.е. 7+9=16

И это оказалось очень удобно для машинных вычислений — при таком представлении отрицательного числа операции сложения и вычитания можно реализовать одной схемой сложения, при этом очень легко определять переполнение результата (когда для представления получившегося числа не хватает разрядности)

Читайте также:  Лампы со спектром солнечного света

Пара примеров
7-3=4
0111 прямой код 7
1101 дополнительный код 3
0100 результат сложения 4

-1+7=6
1111 дополнительный код 1
0111 прямой код 7
0110 результат сложения 6

Что касается переполнения — оно определяется по двум последним переносам, включая перенос за старший разряд. При этом если переносы 11 или 00, то переполнения не было, а если 01 или 10, то было. При этом, если переполнения не было, то выход за разряды можно игнорировать.

Примеры где показаны переносы и пятый разряд

00111 прямой код 7
00001 прямой код 1
01110 переносы
01000 результат 8 — переполнение

Два последних переноса 01 — переполнение

-7+7=0
00111 прямой код 7
01001 дополнительный код 7
11110 переносы
10000 результат 16 — но пятый разряд можно игнорировать, реальный результат 0

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

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

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

Выбор способа хранения целых чисел в памяти компьютера — не такая тривиальная задача, как могло бы показаться на первый взгляд. Желательно, чтобы этот способ:

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

Рассмотрим разные методы представления.

Содержание

Прямой код [ править ]

При записи числа в прямом коде (англ. Signed magnitude representation) старший разряд является знаковым разрядом. Если его значение равно нулю, то представлено положительное число или положительный ноль, если единице, то представлено отрицательное число или отрицательный ноль. В остальных разрядах (которые называются цифровыми) записывается двоичное представление модуля числа. Например, число [math] -5 [/math] в восьмибитном типе данных, использующем прямой код, будет выглядеть так: [math] 10000101 [/math] .

Таким способом в [math] n [/math] -битовом типе данных можно представить диапазон чисел [math] [-2^ + 1; 2^ – 1] [/math] .

Достоинства представления чисел с помощью прямого кода [ править ]

  1. Получить прямой код числа достаточно просто.
  2. Из-за того, что [math]0[/math] обозначает [math]+[/math] , коды положительных чисел относительно беззнакового кодирования остаются неизменными.
  3. Количество положительных чисел равно количеству отрицательных.

Недостатки представления чисел с помощью прямого кода [ править ]

  1. Выполнение арифметических операций с отрицательными числами требует усложнения архитектуры центрального процессора (например, для вычитания невозможно использовать сумматор, необходима отдельная схема для этого).
  2. Существуют два нуля: [math] -0 [/math] [math](100 ldots 000) [/math] и [math] +0 [/math] [math] (000 ldots 000) [/math] , из-за чего усложняется арифметическое сравнение.

Из-за весьма существенных недостатков прямой код используется очень редко.

Код со сдвигом [ править ]

При использовании кода со сдвигом (англ. Offset binary) целочисленный отрезок от нуля до [math] 2^n [/math] ( [math] n [/math] — количество бит) сдвигается влево на [math] 2^ [/math] , а затем получившиеся на этом отрезке числа последовательно кодируются в порядке возрастания кодами от [math] 000 dots 0 [/math] до [math] 111 dots 1 [/math] . Например, число [math] -5 [/math] в восьмибитном типе данных, использующем код со сдвигом, превратится в [math] -5 + 128 = 123 [/math] , то есть будет выглядеть так: [math] 01111011 [/math] .

По сути, при таком кодировании:

  • к кодируемому числу прибавляют [math] 2^ [/math] ;
  • переводят получившееся число в двоичную систему исчисления.

Можно получить диапазон значений [math] [-2^; 2^ – 1][/math] .

Достоинства представления чисел с помощью кода со сдвигом [ править ]

  1. Не требуется усложнение архитектуры процессора.
  2. Нет проблемы двух нулей.

Недостатки представления чисел с помощью кода со сдвигом [ править ]

  1. При арифметических операциях нужно учитывать смещение, то есть проделывать на одно действие больше (например, после «обычного» сложения двух чисел у результата будет двойное смещение, одно из которых необходимо вычесть).
  2. Ряд положительных и отрицательных чисел несимметричен.

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

Дополнительный код (дополнение до единицы) [ править ]

В качестве альтернативы представления целых чисел может использоваться код с дополнением до единицы (англ. Ones’ complement).

Алгоритм получения кода числа:

  • если число положительное, то в старший разряд (который является знаковым) записывается ноль, а далее записывается само число;
  • если число отрицательное, то код получается инвертированием представления модуля числа (получается обратный код);
  • если число является нулем, то его можно представить двумя способами: [math] +0 [/math] [math](000 ldots 000) [/math] или [math] -0 [/math] [math] (111 ldots 111) [/math] .

Пример: переведём число [math] -13 [/math] в двоичный восьмибитный код. Прямой код модуля [math] -13 [/math] : [math] 00001101 [/math] , инвертируем и получаем [math] 11110010 [/math] . Для получения из дополнительного кода самого числа достаточно инвертировать все разряды кода.

Таким способом можно получить диапазон значений [math] [-2^+1; 2^ – 1] [/math] .

Достоинства представления чисел с помощью кода с дополнением до единицы [ править ]

  1. Простое получение кода отрицательных чисел.
  2. Из-за того, что [math]0[/math] обозначает [math]+[/math] , коды положительных чисел относительно беззнакового кодирования остаются неизменными.
  3. Количество положительных чисел равно количеству отрицательных.

Недостатки представления чисел с помощью кода с дополнением до единицы [ править ]

  1. Выполнение арифметических операций с отрицательными числами требует усложнения архитектуры центрального процессора.
  2. Существуют два нуля: [math] +0 [/math] и [math] -0 [/math] .

Дополнительный код (дополнение до двух) [ править ]

Чаще всего для представления отрицательных чисел используется код с дополнением до двух (англ. Two’s complement).

Алгоритм получения дополнительного кода числа:

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

В качестве примера переведём число [math] -5 [/math] в дополнительный восьмибитный код. Прямой код модуля [math] -5 [/math] : [math] 0000101 [/math] , обратный — [math] 1111010 [/math] , прибавляем [math] 1 [/math] , получаем [math] 1111011 [/math] , приписываем [math] 1 [/math] в качестве знакового разряда, в результате получаем [math] 11111011 [/math] .

Также дополнительный код отрицательного числа [math] A [/math] , хранящегося в [math] n [/math] битах, равен [math] 2^n – |A| [/math] . По сути, дополнительный код представляет собой дополнение [math] |A| [/math] до [math] 0 [/math] : так как в [math] n [/math] -разрядной арифметике [math] 2^ = 0 [/math] (двоичная запись этого числа состоит из единицы и [math] n [/math] нулей, а в [math] n [/math] -разрядную ячейку помещаются только [math] n [/math] младших разрядов, то есть [math] n [/math] нулей), то верно равенство [math] 2^n – |A| + |A| = 0 [/math] .

Для получения из дополнительного кода самого числа нужно инвертировать все разряды кода и прибавить к нему единицу. Можно проверить правильность, сложив дополнительный код с самим числом: результат должен быть равен [math] 2^n [/math] . Переведём [math] 11111011 [/math] обратно. Инвертируем — [math] 00000100 [/math] , прибавляем [math] 1 [/math] , получаем [math] 00000101 [/math] — модуль исходного числа [math] -5 [/math] . Проверим: [math] 11111011 + 00000101 = 100000000 [/math] .

Можно получить диапазон значений [math] [-2^; 2^ – 1] [/math] .

Длинная арифметика для чисел, представленных с помощью кода с дополнением до двух [ править ]

Дополнительный код также удобно использовать для вычислений в длинной арифметике, особенно для операций сложения и вычитания. Это операции удобно выполнять с числами одинаковой длины, поэтому в старшие разряды меньшего числа нужно поместить нули (если число положительно) или единицы (если число отрицательно). Тогда числа будут выглядеть следующим образом: в старших разрядах бесконечное число нулей (единиц), а в младших разрядах уже встречаются и нули, и единицы, которые кодируют само число, а не знак. Удобство заключается в том, что нам не обязательно проделывать операции сложения с каждой парой бит, если мы знаем, что на этом отрезке в числах стоят либо единицы, либо нули. Таким образом, на этом отрезке в получившемся числе тоже будут либо только единицы, либо только нули. Операцию сложения можно выполнить только один раз для старших битов, таким образом мы узнаем знак получившегося числа. Вычитание тоже выполняется просто: инвертируем число, прибавляем один и получаем это число с минусом, затем просто делаем сложение. Однако умножение с числами, представленными дополнительным кодом, выполнять не всегда оптимально: алгоритм либо слишком медленный (наивный алгоритм работает за [math]O(n^2)[/math] ), либо слишком сложный. Лучше для умножение использовать прямой код (бит под знак). Тогда можно числа перевести в десятичную систему счисления, выполнить быстрое преобразование Фурье за [math]O(n log n)[/math] , затем перевести их обратно в двоичную. Обычно такой алгоритм работает быстрее, чем выполнение операции напрямую с двоичными числами. Для деления обычно тоже лучше использовать прямой код.

Достоинства представления чисел с помощью кода с дополнением до двух [ править ]

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

Недостатки представления чисел с помощью кода с дополнением до двух [ править ]

  1. Ряд положительных и отрицательных чисел несимметричен, но это не так важно: с помощью дополнительного кода выполнены гораздо более важные вещи, желаемые от способа представления целых чисел.
  2. В отличие от сложения, числа в дополнительном коде нельзя сравнивать как беззнаковые, или вычитать без расширения разрядности.

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

Презентация к уроку “Представление целых чисел”

Вебинар с доктором Александром Мясниковым на тему:

«Здоровое общество. Как простые действия одних людей спасают жизни других»

Описание презентации по отдельным слайдам:

Вычислите выражения и запишите ответ в двоичной и десятичной системах счисления 1. (167 8 + 29916 +30 10):1112 Ответ: ___________________________ 2. ((40716 – 378):101002 + 1448):19 16* 3210 Ответ: ___________________________ 3. 21 8*1216 :610 – 1638 + 3116 Ответ: _____________________________________________ Представление целых чисел в оперативной памяти компьютера Ответ: 11610, 11101002 Ответ: 19210, 110000002 Ответ: -1510, 11111111111100012

Для хранения целых чисел со знаком отводится две ячейки памяти (16 битов), причем старший (левый) разряд отводится под знак числа (если число положительное, то в знаковый разряд записывается 0, если число отрицательное – 1). Представление целых чисел в оперативной памяти компьютера Знаковый разряд 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0

Представление целых чисел в оперативной памяти компьютера Число 24 десятичное представляется, как Число -24 десятичное представляется, как 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 1 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 1 1 1 1 1 1 1 1 1 1 1 0 1 0 0 0 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0

Дополнительный код представляет собой дополнение модуля отрицательного числа А до 0, так как в n-разрядной компьютерной арифметике: 2n – |А| + |А| = 0, поскольку в компьютерной n-разрядной арифметике 2n = 0. Действительно, двоичная запись такого числа состоит из одной единицы и n нулей, а в n-разрядную ячейку может уместиться только n младших разрядов, то есть n нулей. Представление целых чисел в оперативной памяти компьютера

Все отрицательные числа в оперативной памяти записываются в дополнительном коде Дополнение числа ( дополнительный код) определяется, как величина, которая будучи прибавлена к данному числу, обращает в ноль все разряды числа и переносит 1 в следующий разряд Например дополнением числа 25 в десятичной системе счисления называется число d , такое что 25+ d = 100 Чему равно дополнение числа 25 в восьмеричной системе счисления? Представление целых чисел в оперативной памяти компьютера Чему равно дополнение числа 25 в шестнадцатеричной системе счисления?

Назовите наибольшее целое число, которое хранится в 2-х байтах? Чему равно это число в десятичной системе счисления? Назовите минимальное отрицательное целое число, которое хранится в 2-х байтах? Как это число записывается в оперативной памяти компьютера? Представление целых чисел в оперативной памяти компьютера 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0

Алгоритм получения дополнительного кода для отрицательного числа 2. Получить обратный код. Поменять каждый ноль на единицу, а единицу на ноль ( инвертировать число) 3. К обратному коду прибавить 1 1. Найти прямой код числа ( перевести число в двоичную систему счисления число без знака)

Найдем дополнительный код десятичного числа -47 1. Найдем двоичную запись числа 47 ( прямой код) 2. Инвертируем это число ( обратный код) 3. Прибавим 1 к обратному коду и получим запись этого числа в оперативной памяти 0 0 0 0 0 0 0 0 0 0 1 0 1 1 1 1 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 1 1 1 1 1 1 1 1 1 1 0 1 0 0 0 0 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 1 1 1 1 1 1 1 1 1 1 0 1 0 0 0 1 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0

Запишем дополнительный код отрицательного числа -2002 для 16-разрядного компьютерного представления: Представление целых чисел в оперативной памяти компьютера Прямой код модуля числа |-200210| 00000111110100102 Обратный код Инвертирование 11111000001011012 Прибавление единицы 11111000001011012 0000000000000001 Дополнительный код 11111000001011102

Как запишутся в оперативной памяти компьютера и калькулятора следующие десятичные числа в 16-ти разрядной сетке 1. 5710 2. 20010 3. -11710 Прямой код Обратный код Дополнительный код

Как запишутся в оперативной памяти компьютера и калькулятора следующие десятичные числа в 16-ти разрядной сетке 1. -20010 2. -111710 Прямой код Обратный код Дополнительный код Прямой код Обратный код Дополнительный код

  • Кривихина Надежда МихайловнаНаписать 674 16.04.2018

Номер материала: ДБ-1455552

Добавляйте авторские материалы и получите призы от Инфоурок

Еженедельный призовой фонд 100 000 Р

    16.04.2018 259
    16.04.2018 272
    15.04.2018 71
    15.04.2018 738
    15.04.2018 125
    15.04.2018 140
    15.04.2018 323
    15.04.2018 178

Не нашли то что искали?

Вам будут интересны эти курсы:

Оставьте свой комментарий

Все материалы, размещенные на сайте, созданы авторами сайта либо размещены пользователями сайта и представлены на сайте исключительно для ознакомления. Авторские права на материалы принадлежат их законным авторам. Частичное или полное копирование материалов сайта без письменного разрешения администрации сайта запрещено! Мнение редакции может не совпадать с точкой зрения авторов.

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

Дополнение Б – Представление чисел

Представление чисел в позиционной системе исчисления

Любое n-разрядное число K в позиционной системе может быть представлено в виде следующего полинома

где ai – весовые коэффициенты при соответствующих разрядах, X – основание системы.

Основание системы определяет количество чисел, которое используется в системе исчисления. Коэффициенты ai могут быть представлены только числами из этого набора. Например, в двоичной системе (основание X=2), используются числа 0 и 1, в десятичной (X=10) – 0…9, в шестнадцатеричной (X=16) – 0…9 и символы A,B,C,D,E,F.

Двоичная система исчисления является доминирующей в вычислительной технике. Она наиболее удобна для обработки данных, представленных на уровне электрических сигналов. Полином (1) в этом случае имеет вид
K = an-1*2 n-1 + an-2*2 n-2 + … + a1*2 1 + a.

Двоичные числа могут отражать до 2 n уникальных комбинаций и, соответственно, предоставляют диапазон изменения переменных 0…2 n-1 . Так для 8-разрядных чисел это 0…255­10, для 16-разрядных – 0…655310 и т.д. (индексы 2,10,16 в обозначениях чисел используется как показатель основания системы).

В табл.1 приведен пример записи чисел в трех различных системах исчисления.

Табл.1. Числа в различных системах исчисления.

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

Дополнительный код это наиболее распространенная форма представления знаковых чисел. Диапазон изменения чисел для n-разрядных данных в двоичной системе -2 n-1 …2 n-1 -1.

Представление неотрицательных чисел в дополнительном коде (см. табл.2) совпадает с соответствующим представлением чисел в позиционной системе. Отрицательные же числа в дополнительном коде получаются в результате следующего действия
– X = 2 n – X (2).

Выражение (2) может быть записано также в следующем виде
– X = 2 n-1 – X + 1 .

Из-за этого дополнительный код иногда называют “дополнение до двух” (2 n-1 – X – действие инверсии или “дополнение до одного” и +1 – действие “дополнение до двух”).
Так, например, можно изменить знак 1-байтового числа 9510 на противоположный
9510­ = 010111112 = 5F16
– 9510­ = 111111112 – 10111112 + 12 = 101000012 = A116

Старший разряд в дополнительном коде всегда является показателем знака числа (знаковый разряд). У положительных чисел MSB=0, а у отрицательных – MSB=1. Модуль наибольшего положительного числа на единицу меньше модуля наименьшего отрицательного числа.

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

Двоично-десятичное кодирование

Для хранения десятичных чисел часто используется двоично-десятичное кодирование (ДДК). В этом случае байты разбиваются на тетрады, в каждой из которых размещаются двоично-кодированные десятичные числа. Например, числу 10010110­2 в ДДК соответствует десятичное число 9610 (1001­2 = 910 – старший полубайт, 0110­2 = 610 – младший полубайт).

ДДК применяется в основном для представления пользовательской информации в удобной и понятной для человека десятичной системе исчисления. Однако формат ДДК позволяет хранить в одном байте только 100 десятичных чисел (числа 0…9910). И, кроме того, далеко не каждый микропроцессор имеет в своей системе команды для обработки чисел в ДДК (в частности, у микроконтроллеров AVR такие команды отсутствуют).

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

Если полином из (1) умножить на X -m , где m неотрицательное целое число, то получим выражение для представления чисел с фиксированной запятой:

Числа такого типа содержат две части: целую и дробную. Под целую часть отводиться n-m разрядов, а под дробную m разрядов. Естественно, что в случае m=0 дробная часть отсутствует и (3) переходит формулу (1).

Например, 8-разрядное двоичное число K с m=4 будет иметь вид
K =a7*2 3 + a6*2 2 + a5*2 1 + a4*2 0 + a3*2 -1 + a2*2 -2 + a1*2 -3 + a*2 -4 (3).

Разряды a7a6a5a4 представляют собой целую часть числа, а a3a2a1a0 – дробную.

Формат чисел с фиксированной запятой имеет обозначение (N.Q), где N и Q число целых и дробных разрядов соответственно. Так в предыдущем примере число K имеет формат (4.4).

При программировании 8-разрядных микроконтроллеров на ассемблере в подобной форме представления, как правило, нет необходимости. Однако числа с фиксированной запятой имеют определенные преимущества при цифровой обработке сигналов в специализированных DSP (Digital Signal Processor) процессорах, где их поддержка введена аппаратном уровне.

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

Числа с плавающей запятой имеют экспоненциальную форму записи, при которой отдельно представляются мантисса и порядок числа.
K = M * 2 E ,

где M – мантисса, E – порядок.

Таким образом, числа с плавающей запятой должны отображаться в ОЗУ микропроцессора в виде двух частей, каждая из которых может иметь соответствующее число разрядов (чаще всего кратное 8).

Как M, так и E, могут быть знаковыми числами. Мантисса должна быть представлена в виде числа с фиксированной запятой и находиться в пределах 0≤|m|≤1, а порядок M – виде целого числа.

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

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

Представление символьной информации в кодировке ASCII

ASCII (American Standard Code for Information Interchange) – общепринятый стандарт кодирования информации. В соответствии с ним каждому символу из табл.3 сопоставляется индивидуальный 7-разрядный числовой код. Таблица разделена на 128 частей, но реально, только диапазону адресов 0x20…0x7E соответствует информация, которая воспринимается, как символьная. Остальные кода, размещенные по адресам 0x00…0x1F и 0x7F, отведены командам управления. Большинство из них поддерживает любая терминальная программа, совместимая с протоколом обмена ASCII. Набор из 21 команды очень универсален и предоставляет широкие возможности по управлению процессом передачи данных. Наиболее распространенные из них приведены в табл.4.

Символы в таблице ASCII расположены не случайным образом, а имеют строгий порядок. Кода символов ‘0’…‘9’ получаются добавлением смещения 0x30 к своему числовому представлению. Буквы ‘A’…‘Z’ имеют порядок следования аналогичный латинскому алфавиту и получаются добавлением смещения 0x41 к порядковому номеру буквы в алфавите. То же самое относится к набору из 26 символов нижнего регистра ‘a’…‘z’ для получения, которых необходимо смещение 0x61.

Табл.3. Таблица символов в кодировке ASCII:

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

Главные правила представления данных в компьютере

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

Рис. 1.5. Образ компьютерной памяти

Рисунок 1.5 отражает известное вам еще из курса информатики основной школы правило представления данных, которое назовем правилом № 1: данные (и программы) в памяти компьютера хранятся в двоичном виде, т. е. в виде цепочек единиц и нулей.

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

Правило № 2: представление данных в компьютере дискретно.

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

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

Сначала поясним на образном примере, что такое дискретность.

Дискретное множество состоит из отделенных друг от друга элементов. Например, песок дискретен, поскольку он состоит из отдельных песчинок. А вода или масло непрерывны (в рамках наших ощущений, поскольку отдельные молекулы мы всё равно ощутить не можем). Этот пример нужен нам только для аналогии. Здесь мы не станем углубляться в изучение материального мира, а вернемся к предмету изучения информатики — информации.

Самым традиционным видом данных, с которым работают компьютеры, являются числа. ЭВМ первого поколения умели решать только математические задачи. Люди начали работать с числами еще с первобытных времен. Первоначально человек оперировал лишь целыми положительными (натуральными) числами: 1, 2, 3, 4, . . Очевидно, что натуральный ряд — это дискретное множество чисел.

В математике ряд натуральных чисел бесконечен и не ограничен. С появлением в математике понятия отрицательного числа (Р. Декарт, XVII век в Европе; в Индии значительно раньше) оказалось, что множество целых чисел не ограничено как «справа», так и «слева». Покажем это на числовой оси (рис. 1.6), символы оо обозначают бесконечность.

Рис. 1.6. Математическое множество целых чисел на числовой оси

Из сказанного следует вывод: множество целых чисел в математике дискретно и не ограничено. Отметим еще один факт: разность соседних чисел натурального ряда (данного и предыдущего) всегда равна единице. Эту величину назовем шагом числовой последовательности.

Любое вычислительное устройство (компьютер, калькулятор) может работать только с ограниченным множеством целых чисел. Возьмите в руки калькулятор, на индикаторном табло которого помещается 10 знаков. Самое большое положительное число, которое на него поместится:

Самое большое по абсолютной величине (модулю)

Аналогично дело обстоит и в компьютере.

Целые числа в компьютере

Правило № 4: в памяти компьютера числа хранятся в двоичной системе счисления*. С двоичной системой счисления вы знакомы из курса информатики 7-9 классов. Например, если под целое число выделяется ячейка памяти размером в 16 битов, то самое большое целое положительное число будет таким:

В десятичной системе счисления оно равно:

2 15 – 1 = 32 767.

Здесь первый бит играет роль знака числа. Ноль — признак положительного числа. Самое большое по модулю отрицательное число равно -32 768. Напомним (это было в курсе информатики основной школы), как получить его внутреннее представление:

    перевести число 32 768 в двоичную систему счисления; это легко, поскольку 32768 = 2 15 :

1000000000000000;
инвертировать этот двоичный код, т. е. заменить нули на единицы, а единицы — на нули:

0111111111111111;

  • прибавить единицу к этому двоичному числу (складывать надо по правилам двоичной арифметики), в результате получим:
  • Единица в первом бите обозначает знак «минус». Не нужно думать, что полученный код — это «минус ноль». Этот код представляет число -32 768. Таковы правила машинного представления целых чисел. Данное представление называется дополнительным кодом.

    Если под целое число в памяти компьютера отводится N битов, то диапазон значений целых чисел:

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

    Мы рассмотрели формат представления целых чисел со знаком, т. е. положительных и отрицательных. Бывает, что нужно работать только с положительными целыми числами. В таком случае используется формат представления целых чисел без знака. В этом формате самое маленькое число — ноль (все биты — нули), а самое большое число для 16-разрядной ячейки:

    В десятичной системе это 2 16 – 1 = 65 535, примерно в два раза больше по модулю, чем в представлении со знаком.

    Из всего сказанного делаем вывод: целые числа в памяти компьютера — это дискретное, ограниченное и конечное множество.

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

    Рисунок 1.7 отражает то обстоятельство, что при переходе от математического представления множества целых чисел к представлению, используемому в информатике (компьютере), происходит переход к ограниченности и конечности.

    Рис. 1.7. Представление о множестве целых чисел в математике и в информатике

    Вещественные числа в компьютере

    Понятие вещественного (действительного) числа в математику ввел Исаак Ньютон в XVIII веке. В математике множество вещественных чисел непрерывно, бесконечно и не ограничено. Оно включает в себя множество целых чисел и еще бесконечное множество нецелых чисел. Между двумя любыми точками на числовой оси лежит бесконечное множество вещественных чисел, что и означает непрерывность множества.

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

    Снова для примера возьмем калькулятор с десятиразрядным индикаторным табло. Экспериментально докажем дискретность представления вещественных чисел. Выполним на калькуляторе деление 1 на 3. Из математики вам известно, что 1/3 — это рациональная дробь, представление которой в виде десятичной дроби содержит бесконечное количество цифр: 0,3333333333. (3 в периоде). На табло калькулятора вы увидите:

    Первый разряд зарезервирован под знак числа. После запятой сохраняется 8 цифр, а остальные не вмещаются в разрядную сетку (так это обычно называют). Значит, это не точное значение, равное 1/3, а его «урезанное» значение.

    Следующее по величине число, которое помещается в разрядную сетку:

    Оно больше предыдущего на 0,00000001. Это шаг числовой последовательности. Следовательно, два рассмотренных числа разделены между собой конечным отрезком. Очевидно, что предыдущее число такое:

    Оно тоже отделено от своего «соседа справа» по числовой оси шагом 0,00000001. Отсюда делаем вывод: множество вещественных чисел, представимых в калькуляторе, дискретно, поскольку числа отделены друг от друга конечными отрезками.

    А теперь выясним вот что: будет ли шаг в последовательности вещественных чисел на калькуляторе постоянной величиной (как у целых чисел)?

    Вычислим выражение 100000/3. Получим:

    Это число в 100 000 раз больше предыдущего и, очевидно, тоже приближенное. Легко понять, что следующее вещественное число, которое можно получить на табло калькулятора, будет больше данного на 0,0001. Шаг стал гораздо больше.

    Отсюда приходим к выводу: множество вещественных чисел, представимых в калькуляторе, дискретно с переменной величиной шага между соседними числами.

    Если отметить на числовой оси точные значения вещественных чисел, которые представимы в калькуляторе, то эти точки будут расположены вдоль оси неравномерно. Ближе к нулю — чаще, дальше от нуля — реже (рис. 1.8).

    Рис. 1.8. Условное представление взаимного расположения множества вещественных чисел, представимых в компьютере

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

    Ответим на вопрос: ограничено ли множество вещественных чисел в памяти компьютера? Если продолжать эксперименты с калькулятором, то ответ на этот вопрос будет таким: да, мнолсест-во вещественных чисел в калькуляторе ограничено. Причиной тому служит все та же ограниченность разрядной сетки. Отсюда же следует и конечность множества.

    Самое большое число у разных калькуляторов может оказаться разным. У самого простого это будет то же число, что мы получали раньше: 999999999. Если прибавить к нему единицу, то калькулятор выдаст сообщение об ошибке. А на другом, более «умном» и дорогом, калькуляторе прибавление единицы приведет к такому результату:

    Данную запись на табло надо понимать так: 1 • 10 9 .

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

    Число, стоящее перед буквой «е», называется мантиссой, а стоящее после — порядком. «Умный» калькулятор перешел к представлению чисел в формате с плавающей запятой после того, как под формат с фиксированной запятой не стало хватать места на табло.

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

    Но и для формата с плавающей запятой тоже есть максимальное число. В нашем «подопытном» калькуляторе это число:

    То есть 99999 • 10 99 . Самое большое по модулю отрицательное значение -99999 • 10 99 . Данные числа являются целыми, но именно они ограничивают представление любых чисел (целых и вещественных) в калькуляторе.

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

    Рассмотрим пример: пусть под всё число в компьютере выделяется 8 байтов — 64 бита, из них под порядок — 2 байта, под мантиссу — 6 байтов. Тогда диапазон вещественных чисел, в переводе в десятичную систему счисления, оказывается следующим:

    ±(5 • 10 -324 – 1,7 • 10 308 ).

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

    Рис. 1.9. Представление о множестве вещественных чисел в математике и в информатике

    Система основных понятий

    Вопросы и задания

    1. Почему множество целых чисел, представимых в памяти компьютера, дискретно, конечно и ограничено?
    2. Определите диапазон целых чисел, хранящихся в 1 байте памяти в двух вариантах: со знаком и без знака.
    3. Получите внутреннее представление числа 157 в 8-разрядной ячейке памяти в формате со знаком.
    4. Получите внутреннее представление числа -157 в 8-разрядной ячейке памяти в формате со знаком.
    5. Почему множество действительных (вещественных) чисел, представимых в памяти компьютера, дискретно, конечно и ограничено?
    6. На какие две части делится число в формате с плавающей запятой?

    * Конечно, и «внутри калькулятора» числа представляются в двоичном виде. Однако мы в это вдаваться не будем, рассмотрев лишь внешнее представление. Пример с калькулятором нам нужен был только для иллюстрации проблемы ограниченности.

    Рейтинг
    ( Пока оценок нет )
    Загрузка ...
    Adblock
    detector
    Десятичная
    система