УРОК 3. Представление целых чисел в компьютере
Самая маленькая единица информации, которая может быть представлена в компьютере - бит. Бит
имеет два значения: «истина» (1) и «ложь» (0). Такой сигнал можно
представить также в следующем виде: имеется напряжение (1) или нет (0),
имеется углубление (1) на компакт-диске или нет (0), имеется
определенная направленность магнитного поля (1) на магнитном носителе
или нет (0), в оперативной памяти используются транзисторы, которые
принимают одно из двух значений или конденсаторы, которые могут быть
заряжены или не иметь заряда и так далее.
Поэтому
в компьютере используется двоичная система счисления. Если бы данные
хранились в десятичной системе счисления, то требовалось бы
использование большего объема памяти. Рассмотрим это подробнее.
Бит,
как уже указывалось, может принимать значение ноль и единица. Число 7 в
двоичной системе счисления представляется как 111b, то есть 1х22+ 1х21 + 1х20= 1х4 + 1х2 + 1х1. Для представления числа 7 требуется три бита.
На
самом деле число бит, выделенных для числа, имеет не переменную, а
фиксированную длину. Для представления чисел используется 8 бит, 16 и
т.д. бит. 8 бит называется байтом. Место, выделяемое для
хранения числа, кратно байту. Максимальное число, которое можно
представить в байте, в двоичном виде равно 1111 1111b = 1х27 + 1х26 + 1х25 + 1х24 + 1х23 + 1х22 + 1х21 + 1х20
= 255 или с нулем - 256 значений. Для представления десятичного числа
необходимо использовать 4 бита на один разряд, тогда максимальное
число, которое можно представить в байте (8бит = 2х4 или две цифры)
равно 9х101 + 9х100 = 99 или всего 100 значений вместе с нулем.
Понятно,
что в двоичной системе счисления можно представить больший диапазон
чисел, чем в десятичной системе. В середине двадцатого века, когда
развивались основные принципы построения компьютеров, оперативная и
другие виды памяти были очень дорогими, поэтому не использовать
возможности двоичного представления было бы нерациональным. Для
представления чисел до сих пор находит применение эта система. Для
того, чтобы пользователь не путался в большом числе нулей и единиц,
используется шестнадцатеричная система счисления, которая будет
рассмотрена дальше.
Положительные числа
хранятся в форме естественной для понимания, то есть число 4 будет
представлено как 0000 0000 0000 0100b, где первый (0) бит обозначает
знак (+), а остальные предназначены для значения самого числа.
Отрицательные значения могут храниться в двух видах, либо со знаковым представлением (прямой код):
для 4 это будет 1000 0000 0000 0100b, где первый бит (1) обозначает
знак числа (-), а далее находится значение по модулю 4. Либо, что чаще,
с дополнением до двух (дополнительный код), где значение –4
будет представлено в виде 1111 1111 1111 1100b, в котором первый бит
определяет знак числа, а само значение минус четыре имеет
инвертированное представление, при котором вместо 1 пишется 0, а вместо
0 – 1. Например, число –1 представлено как 1111 1111 1111 1111b, число
–2 как 1111 1111 1111 1110b. То есть для того, чтобы представить число
–4, нужно вычесть из значения числа единицу, получим –3. Число 3 можно
представить как 0000 0000 0000 0011b и далее инвертировав 0 и 1,
получим 1111 1111 1111 1100b.
Это
представление удобно для сложения двоичных чисел. Например, если
сложить –4 и +5, то сумму можно получить побитным сложением:
1111 1111 1111 1100b
+0000 0000 0000 0101b
0000 0000 0000 0001b
В
результате получим значение 1. При этом процессору не нужно сравнивать
знаки, что увеличивает скорость выполнения операции. В данном примере
подсчет ведется подобно десятичной системе следующим образом: если оба
слагаемых равны 0, то результат 0, 0 и 1 дает 1, а 1 и 1 дают 0, причем
возникает бит переноса, равный 1, который прибавляется к следующему
слева разряду.
В
некоторых языках программирования могут существовать переменные,
которые содержат только неотрицательные значения. Понятно, что в таких
переменных знак числа отсутствует, но количество значений, которые они
могут принимать, такое же, как и у знаковых переменных. Проведем
подсчет. Если под переменную выделяется 1 байт или 8 бита, то знаковая
переменная может иметь 27-1= 127 положительных и 27=128
отрицательных значений. Положительных на одно значение меньше, так как
одно значение используется под ноль. Всего 127 (положительных) + 1
(нулевое) + 128 (отрицательных) = 256 значений. Для беззнаковой
переменной используется 28 = 256 значений от 0 до 255 или 1 (нулевое) + 255 (положительных) = 256.
Сложение двоичных чисел проводится так, как это было указано в примере, приведенном выше.
Вычитание двоичных чисел также проводится столбиком, как это делается для десятичных чисел. Попробуем вычесть 15 – 5 = 10:
0000 0000 0000 1111b
- 0000 0000 0000 0101b
0000 0000 0000 1010b
При
этой операции, если нет признака переноса и обе цифры равны 1 или 0, то
пишем 0, 1 – 0 = 1, 0 – 1 = 1. Приведем еще несколько примеров, где
сначала запишем операцию для десятичных значений, а ниже для двоичных:
5 – 10 = -5
0000 0000 0000 0101b
- 0000 0000 0000 1010b
1111 1111 1111 1011b
Вычитаем
слева направо. Сначала 1 – 0 = 1, затем 0 – 1 = 1 и бит переноса = 1, 1
– 0 – бит переноса равный единице = 0, 0 – 1 = 1 и бит переноса равен
1, далее 0 – 0 – бит переноса = 1 и один бит переноса и так далее.
5 – (-5) = 10
0000 0000 0000 0101b
- 1111 1111 1111 1011b
0000 0000 0000 1010b
Вычитание проводится по тем же правилам, что и раньше, только нужно смотреть внимательней за битом переноса.
Дальнейшие
операции дадим для чисел, которые занимают 1 байт. Для чисел, которые
занимают 2 байта, последовательность действий будет такая же.
Операция умножения проводится так же, как и для десятичных чисел, которую лучше продемонстрировать на примере (5 х 5 = 25):
0000 0101b
х 0000 0101b
00000101
00000101
00011001b
После
выполнения операции, лидирующие нули опустим, оставив лишь те нули,
которые нужны для того, чтобы были заполнены восемь позиций.
Операция деления проводится также, как и для десятичных чисел, что покажем на примере (25:5=5):
|