ФЭНДОМ


Орлова Е.А.Править

В компьютерной технике очень часто используется двоичная система счисления. Такую систему очень легко реализовать в электронике (полупроводниковые транзисторы и микросхемы), так как для неё требуется всего два устойчивых состояния (0 и 1).

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

Чтобы преобразовать число в десятичном виде к двоичному, нам нужно будет делить всё время на два и смотреть на остаток от деления. Возьмём число 33.

·       33 : 2 = 16 остаток 1;

·       16 : 2 = 8 остаток 0;

·       8 : 2 = 4 остаток 0;

·       4 : 2 = 2 остаток 0;

·       2 : 2 = 1 остаток 0;

·       1 : 2 = 0 остаток 1;

Получили 100001.

Возьмём число 55. Посмотрим, что получится.

·       55 : 2 = 27 остаток 1;

·       27 : 2 = 13 остаток 1;

·       13 : 2 = 6 остаток 1;

·       6 : 2 = 3 остаток 0;

·       3 : 2 = 1 остаток 1;

·       1 : 2 = 0 остаток 1.

Получили 110111.

Двоичная арифметика

Над числами в двоичной системе счисления можно выполнять арифметические действия.

При этом используются следующие таблицы:

Сложение

Вычитание

Умножение

0+0=0

0-0=0

0*0=0

1+0=1

1-0=1

1*0=0

0+1=1

1-1=0

0*1=0

1+1=10

10-1=1

1*1=1

ДРОБНЫЕ ЧИСЛА В ДВОИЧНОЙ СИСТЕМЕ СЧИСЛЕНИЯ

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

Запишем формулу представления дробного числа в позиционной системе счисления: 

Ap = an-1·pn-1+an-2·pn-2 + ... + a1·p1+a0·p0 +a-1·p-1+a-2·p-2 + ... + a-m·p-m,       

В случае десятичной системы счисления получим:

24,7310 = (2·101+4·100+7·10-1+3·10-2)10

Перевод дробного числа из двоичной системы счисления в десятичную производится по следующей схеме:

101101,1012 = (1·25+0·24+1·23+1·22+0·21+1·20+1·2-1+0·2-2+1·2-3)10=45,62510

Перевод дробного числа из десятичной системы счисления в двоичную осуществляется по следующему алгоритму:

·  Вначале переводится целая часть десятичной дроби в двоичную систему счисления;

·  Затем дробная часть десятичной дроби умножается на основание двоичной системы счисления;

·  В полученном произведении выделяется целая часть, которая принимается в качестве значения первого после запятой разряда числа в двоичной системе счисления;

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

Пример: Требуется перевести дробное десятичное число 206,116 в дробное двоичное число.

Перевод целой части дает 20610=110011102 по ранее описанным алгоритмам; дробную часть умножаем на основание 2, занося целые части произведения в разряды после запятой искомого дробного двоичного числа:

 .116 • 2 = 0.232

.232 • 2 = 0.464

.464 • 2 = 0.928

.928 • 2 = 1.856

.856 • 2 = 1.612

.612 • 2 = 1.224

.224 • 2 = 0.448

.448 • 2 = 0.896

.896 • 2 =1.792

.792 • 2 = 1.584

и т.д.

Получим: 206,11610=11001110,00011100112

Отрицательные числа

Перейдем теперь к вопросу представления отрицательных чисел. Для определенности рассмотрим типbyte, в котором любое число занимает ровно восемь бит. Из записи в двоичной системе счисления равенства (- 1) + 1 = 0 легко найти, какой вид должно иметь неизвестное нам пока двоичное представление xxxxxxxx числа - 1:

    xxxxxxxx + 00000001 = 00000000     

Ясно, что на месте символов xxxxxxxx должно быть расположено число 11111111. Правильным результатом при этом, конечно, следовало бы считать 100000000, а не 00000000, но ведь мы имеем дело с типом byte и, так как результат обязан разместиться в байте, единица <<исчезает>>.

Итак, число - 1 должно кодироваться как 11111111. Дальнейшее уже совсем просто: для получения - 2нужно - 1 уменьшить на единицу, что даст 11111110; число - 3 представляется как 11111101 и т.д.

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

Легко видеть, что при этом самым маленьким отрицательным числом, которое принадлежит типу byte, является число - 128 (двоичное представление 10000000), а самым большим -- число 127(представление 01111111). Все представимыe числа (а их 256) в данном случае могут быть получены как пересечение двух множеств: множества Z всех целых чисел и отрезка [ - 128; 127 ].

Интересным является следующее наблюдение: если число 01111111 увеличить на единицу, то получится10000000, что означает следующее:

127 + 1 = - 128 !!!

Итак, множество элементов типа byte можно представлять себе в виде свернутого в кольцо отрезка [ - 128; 127 ].

То, что для элементов множества , являющегося машинным аналогом Z, нарушено фундаментальное свойство целых чисел X + 1 > X, способно привести к различным невероятным на первый взгляд результатам, однако гораздо более странные вещи происходят при работе с вещественными числами.