Двоичная система работы процессора

Компьютеры изобрели достаточно давно. В те далекие времена электроника только начинала зарождаться, поэтому первые компьютеры были ламповыми и за­нимали очень много места. Для того чтобы управлять такой махиной, нужно было очень много обслуживающего персонала. Со временем лампы начали вытесняться электронными компонентами, и компьютеры стали уменьшаться в размерах. Сейчас же мы видим результат прогресса и на наших рабочих столах находятся небольшие системные блоки, которые занимают мало места, а по производительности могут обойти серверы 5—10-летней давности.

 

В конце 1990-х годов я работал на большом предприятии, на котором сохрани­лись компьютеры 1970-х годов. Это были шкафы (в прямом смысле этого слова), произведенные в Советском Союзе. Вы помните, что была такая страна? Так вот, в то время у меня дома стоял Pentium 100, который был в сто раз меньше и в тыся­чу раз быстрее.

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

 

Суть их заключается в следующем. Данные пере­даются с помощью какого-то сигнала (для нас не имеет значения какого, потому что мы не электронщики) методом "есть сигнал или нет" или, по-другому, "вклю­чен или выключен". Так появился "бит" (bit). Бит— это единица информации, ко­торая может принимать значение 0 или 1, т. е. "включен или выключен". Восемь бит объединяются в байт, один байт равен 8 битам. Почему именно 8? Да потому что первые компьютеры были восьмиразрядными и могли работать одновременно только с 8 разрядами (битами), например, 010000111.

 

Все первые нули можно удалять, поэтому число 010000111 можно записать как— 10000111. Это то же самое, что и в привычной для нас десятичной системе исчисления, где каждый разряд может принимать значения от 0 до 9. Здесь также
никто не будет писать число 5743 как 0005743, потому что первые нули не имеют никакого значения.

В один байт можно записать любое число от 0 до 255. Почему? Об этом немного позже. Указанный диапазон чисел довольно мал. Поэтому чаще используют более крупные градации:

  • два байта = слово;
  • два слова = двойное слово.

Итак, компьютер стал работать в двоичной системе исчисления. Но как же то­гда записать число 135, если у нас единица информации может принимать значе­ния 0 или 1? Это можно сделать в двоичной системе. Давайте разберемся, как это работает.

 

Для начала вспомним, как действует десятичная система исчисления, к которой мы привыкли. Для этого рассмотрим число 19 578 246. Я специально выбрал такое число, чтобы оно состояло из восьми разрядов (цифр). Теперь запишем его, как по­казано на рис. 1.1.

программирование

Рис. 1.1. Число 19 578 246 в десятичной системе исчисления

Как видите, я пронумеровал разряды начиная с нуля до семи и справа налево. Теперь представьте себе, что это не целое число, а просто набор разрядов. 1, 9, 5, 7, 8, 2, 4 и 6. Как из этих разрядов получить целое число в десятичной системе? Наверное, некоторые скажут, что надо просто записать их подряд. А если я спрошу почему? Вот тут появляется математика. Нужно каждый разряд умножить на 10 (степень исчисления), возведенную в степень номера разряда. Непонятно? Попро­бую оформить сказанное в виде формулы, показанной на рис. 1.2.

программирование

Рис. 1.2. Работа с десятичными числами

 

Давайте посчитаем значение числа по этой формуле начиная с нулевого разряда. Получается, что 6 нужно умножить на 10 в нулевой степени 6 х 10° = 6. Потом при­бавить 4 х 10 в 1-й степени, или 4 х 101 = 40 (итого уже 46). Потом 2 х 10 во 2-й сте­пени, 2 х 102 = 200 (итого 246). Потом 8 х 10 в 3-й степени, 8 х 103 = 8000 (итого 8246) и т. д. В итоге получится число 19 578 246. Магия чисел? Нет, это просто мате­матика, и в школе далеко не всегда нам показывают, что означает десятичная система исчисления, а ведь она достаточно проста.

А теперь рассмотрим двоичную систему исчисления. Здесь каждый* разряд мо­жет принимать значение 0 или 1 (два состояния). Кстати, в десятичной системе у нас каждый разряд мог принимать значения от 0 до 9, т. е. имел десять состояний.

Давайте рассмотрим следующий байт— 10000111. Запишем его на листке бумаги так, как показано на рис. 1.3.

программирование

Рис. 1.3. Двоичное число

Здесь действует та же самая формула, только нужно возводить в степень не 10, а число 2, потому что это число в двоичной системе. 
Опять же произведем расчет начиная с нулевого разряда, т. е. справа налево. Получается, что первую 1 мы должны умножить на 2 в нулевой степени (1 х 2° = 1). 
Следующую единицу нужно умножить на 21, получается 2 (итого 2 + 1 = 3) и т. д. Вот как это будет выглядеть полностью:

(1 х 2°) + (1 х 21) + (1 х 22) + (0 х 23) + (0 х 24) + (0 х 25) + (0 х 26) + (1 х 27) = 135.

Вот так, оказывается, выглядит в двоичной системе исчисления число 135. Давай¬те теперь научимся пересчитывать числа из десятичной системы в двоичную. Для этого нужно число 135 разделить на.2. Получается 67 и остаток 1 (запомним 1, т. к. она определяет первый двоичный разряд искомого числа). Теперь 67 снова делим на 2, получается 33 и остаток 1 (таким образом получено уже две двоичные едини¬цы, т. е. 11). 33 делим на 2, получаем 16 и остаток 1 (в результате получаем три двоичные единицы, 111). 16 делим на 2, получаем 8 и остаток 0 (результат 0111). И наконец, 8 делим на 2 = 4, остаток от деления при этом будет 0 (получаем 00111); 4 делим на 2 = 2, остаток 0 (получаем 000111); 2 делим на 2 = 1, остаток 0 (итого 0000111). Оставшаяся единица частного на два не делится, значит, это последний, самый старший разряд искомого числа. Просто дописываем ее к ранее сформиро¬ванным разрядам и получаем окончательный ответ— 10000111. Получилось пер¬воначальное число.
Рис. 1.3. Двоичное число
Вот так происходит преобразование чисел в двоичную систему исчисления. Таким же образом можно перевести число в любую другую систему (двоичную, восьмеричную, шестнадцатеричную). Для более полного закрепления материала в табл. 1.1 показано соответствие десятичных чисел двоичным. 
Попробуйте сами перевести пару чисел из одной системы исчисления в другую.
 Таблица 1.1. Таблица соответствия десятичных и двоичных чисел
Десятичное Двоичное Десятичное Двоичное
0 0 6 110
1 1 7 111
2 10 8 1000
3 11 9 1001
4 100 10 1010
5 101    

Например, попробуйте перевести число, состоящее из 8 бит (1 байт), у которого все биты состоят из единиц, в десятичную систему. Вы должны получить 255. Это максимальное число, которое можно записать в одном байте, потому что все его биты равны 1. Вот так и получается, что в 8 бит можно записать числа от 0 до 255. В 16 битах (2 байта или слово) можно записать число от 0 до 65 535. В 32 битах (двойное слово) можно уже записать число от 0 до 4 294 967 295.

 

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

 

Шестнадцатеричная система выглядит немного по-другому. Каждый разряд со­держит уже не 2 состояния (как в двоичной системе) или десять (как в десятичной системе), а шестнадцать. Поэтому один разряд может принимать значения: 1, 2, 3, 4, 5, 6, 7, 8, 9, А, В, С, D, Е, F. Буква "А" соответствует цифре 10 в десятичной системе, "В" соответствует 11 и т. д.

 

Например, число 1А в шестнадцатеричной системе равно 26 в десятичной. Почему? Да в соответствии все с той же формулой. Только здесь нужно возводить уже 16 в степень номера разряда. "А" —десять, нужно умножить на 16°. В результате получится 10. 1 — первый разряд нужно умножить на 161, получит­ся значение 16. Затем полученные результаты складываются и определяется искомое число — 10 + 16 = 26. В результате, как показано в табл. 1.2, можно установить соот­ветствие между числами, записанными в различных системах исчисления.

Таблица 1.2. Таблица соответствия десятичных, двоичных

и шестнадцатеричных чисел

Десятичное

Двоичное

Шестнадцатеричное

0

0

0

1

1

1

2

10

2

3

11

3

4

100

4

5

101

5

6

110

6

7

111

7

8

1000

8

9

1001

9

10

1010

А

11

1011

В

12

1100

С

Таблица 1.2 (окончание)

Десятичное

Двоичное

Шестнадцатеричное

13

1101

D

14

1110

Е

15

1111

F

16

10 000

10

17

10 001

11

18

10010

12

19

10011

13

20

10 100

14

На протяжении всей книги мы будем иногда встречаться с шестнадцатеричной сис­темой исчисления (без этого никуда не денешься). В этом случае, когда нужно будет показать, что число шестнадцатеричное, перед ним будет ставиться знак решетки #, например, #13. В других языках, например Assembler или С++, принято ставить в конце числа букву h (13h). Но этот сайт о Delphi, поэтому здесь будем писать так, как принято в этой среде разработки, чтобы потом не возникало никаких вопросов.

 

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

Теперь разберемся со знаком у чисел. Если заранее предусмотрено, что число может быть отрицательным, то его длина сокращается ровно на один бит (этот бит отводится под знак числа). Так, неотрицательное целое число может быть 8- битным, тогда как число со знаком будет 7-битным. Первый бит будет означать знак. Если первый бит равен 1, то число отрицательное, иначе положительное.

 

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

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

 

На первый взгляд перевод чисел очень сложный процесс, но вручную им зани­маться не обязательно. Человек уже давно придумал для себя хорошего помощни­ка — калькулятор. С его помощью без проблем можно перевести число в любую систему исчисления.

 

Запустите встроенный в Windows калькулятор (Пуск | Программы | Стандарт­ные | Калькулятор). Теперь выберите из меню Вид пункт Инженерный. На рис. 1.4 показано окно, которое вы должны увидеть.

Рис. 1.4. Внешний вид калькулятора
программирование
Для перевода числа в другую систему просто наберите его в окне ввода кальку-лятора и потом выберите нужную систему исчисления. 
На рисунке кнопки пере-ключения из одной системы исчисления в другую выделены овалом:
  • Hex — шестнадцатеричная;
  • Dec — десятичная;
  • Oct — восьмеричная;
  • Bin — двоичная.
Возникает вопрос — зачем здесь так долго рассказывалось о преобразованиях чисел, когда так легко можно воспользоваться калькулятором? 
Ответ прост— это нужно знать. Поверьте мне. Если вы будете понимать, как происходит преобразо-вание, то вам потом легче будет работать с этими числами. Уметь использовать компьютер и язык программирования — это хорошо, но понимать, как и что про-исходит — намного лучше.
dle

Помоги проекту! Расскажи друзьям об этом сайте: