Любой программист рано или поздно сталкивается с проблемой хранения данных в компьютере. Как именно хранятся данные? В чем разница между типами данных? Что происходит, когда один тип преобразуется в другой? Наконец, почему иногда в программах 120+10 дает 130, а иногда - -126??? В зависимости от решаемых задач, языков программирования, собственной лени начинающий программист может какое-то время избегать поисков ответов на поставленные выше вопросы, но, в конце концов, уйти от них ему не удастся (если, конечно, он не переквалифицируется в управдомы или агенты по продаже недвижимости!). Если вы уже осознали необходимость во всем этом разобраться, предлагаемая статья должна вам помочь.
Итак, вопрос: как хранятся данные в компьютере? Давайте для простоты начнем наше рассмотрение с чисел. Мы уже знаем, что числа хранятся в ячейках-байтах. Теперь давайте посмотрим, как они там хранятся.
Ответьте сами себе на вопрос: для чего нужно хранить информацию? Вероятнее всего, ваш ответ будет звучать как-то вроде «для того, чтобы ее можно было получить, когда она потребуется». Причем, получить информацию может как тот, кто ее сохранил (вы записали номер телефона в записной книжке, чтобы не забыть), так и другие (вы записали номер телефона и передали его кому-то).
Какие средства можно использовать для хранения информации? Листочки бумаги или записная книжка – это, конечно, хорошо, но в компьютере явно ничего подобного не наблюдается. Что еще? Пальцы! Как ни странно, но это уже ближе. Конечно, в компьютере пальцев нет, но мы сейчас увидим что представление чисел с помощью пальцев очень похоже на компьютерное представление. Однако, прежде постарайтесь выполнить -
Сколько различных чисел можно показать с помощью пальцев одной руки? Пальцы могут быть только в одном из двух положений: согнут или выпрямлен. Никакие другие положения или изображения с помощью пальцев, равно как и использование каких-либо инструментов не допускаются!
Надеюсь, что вы действительно выполнили или, по крайней мере, попытались выполнить это задание, прежде, чем читать дальше.
Первый, для многих интуитивный ответ «пять» (или даже «шесть» - все разогнуты соответствует 0, один загнут – 1 ... все загнуты – 5), как легко догадаться не верен – иначе не было бы и задания. Если задуматься над тем, что же в нем неправильно, приходят в голову следующие соображения. Скажем, число 2. Мы можем его представить загнутыми мизинцем и безымянным пальцами при всех остальных разогнутых, а можем – загнутыми большим и указательным при всех остальных разогнутых, а также еще несколькими способами. Это явно неэффективно! Можно было бы договориться для каждой возможной комбинации загнутых и разогнутых пальцев, что она будет обозначать какое-то свое число, и тогда получится заведомо больше пяти возможных чисел. Вопрос только в том, сколько таких комбинаций возможно.
Давайте, попробуем это определить. Начнем с одного пальца. Сколько разных состояний у него есть? Согласно условиям задачи – 2: согнут или выпрямлен. Таким образом можно указать два различных числа, допустим, выпрямлен – 0, согнут – 1.
Теперь добавим второй палец. Сколько получится комбинаций? Четыре:
1-й | 2-й | Обозначает число |
Выпрямлен | Выпрямлен | 0 |
Выпрямлен | Согнут | 1 |
Согнут | Выпрямлен | 2 |
Согнут | Согнут | 3 |
Добавим третий палец:
1-й | 2-й | 3-й | Обозначает число |
В | В | В | 0 |
В | В | С | 1 |
В | С | В | 2 |
В | С | С | 3 |
С | В | В | 4 |
С | В | С | 5 |
С | С | В | 6 |
С | С | С | 7 |
где «В» означает «выпрямлен», «С» - «согнут».
Как видите, наблюдается интересная закономерность: при добавлении одного пальца число возможных комбинаций удваивается. Да это и понятно: при выпрямленном новом пальце возможен весь набор комбинаций старых и при согнутом новом пальце опять возможен тот же набор комбинаций старых.
Легко посчитать, что для пяти пальцев число возможных комбинаций, а, значит, и представляемых чисел будет 32.
Теперь, чем же это напоминает компьютер? Для ответа на этот вопрос давайте сначала ответим на другой: какую энергию используют для работы современные компьютеры? В основном, электрическую (хотя бывают, конечно, и пневматические компьютеры, но сейчас речь не о них). А что в первую очередь связано с электричеством? Выключатель! Самое интересное заключается в том, что выключатель как устройство для представления чисел ничем принципиально не отличается от пальцев: точно так же, как у пальца есть два состояния – выпрямлен и согнут – и у выключателя есть два состояния – выключен и включен. Значит, с помощью набора из двух выключателей можно показать четыре различные комбинации, с помощью трех – восемь и т.д. Так вот, из большого количества таких выключателей, грубо говоря, и состоит память компьютера. Конечно, выключатели это не механические, как в комнате на стене – это было бы слишком громоздко. Выключатели эти в большом количестве входят в состав электронных микросхем, из которых строится память компьютера.
Считается, что любой выключатель в компьютере обозначает «0», когда выключен и «1», когда включен. Такой выключатель называется бит.
Однако, всего два числа – это слишком мало для работы. Поэтому биты объединяются в группы, как пальцы на руке, только не по пять, а по восемь. Легко посчитать, что группа из восьми бит может представлять 2*2*2*2*2*2*2*2 = 256 различных значений. Такая комбинация из восьми бит, имеющая 256 различных значений, то есть, способная хранить одно из 256 возможных чисел и называется байт.
Ну хорошо, есть у нас байт, и хранится в нем какая-то комбинация из восьми нулей и единиц, скажем, 00101011. А как определить, какому числу эта комбинация соответствует? В принципе, можно придумать много разных способов представления чисел комбинацией нулей и единиц в байте, но мы используем самый простой и естественный. Представим себе, что байт это странный счетчик на восемь позиций, у которого в каждом окошечке может появляться только одна из двух цифр – 0 или 1. Если сравнить его с обычным счетчиком – газовым, электрическим, счетчиком километров в автомобиле и т.д. – то единственное отличие будет состоять в том, что в обычном счетчике в каждом окошечке может появляться одна из десяти цифр – от 0 до 9.
Как считает обычный счетчик? Сначала по порядку сменяются цифры от 0 то 9 в самом правом окошечке, а во всех остальных – 0. Потом во втором справа окошечке появляется 1 и снова идут все цифры по порядку в самом правом. Так продолжается до тех пор, пока во втором окошечке не сменятся все цифры, после чего появляется 1 в третьем и т.д. При этом, если мы следим за изменениями, мы видим, что счетчик «считает», то есть пробегает последовательно по самым обычным числам. С непривычки могут смущать 0 в левых окошечках, но мы быстро к ним привыкаем.
Точно так же «считает» и наш байт. Правда, поскольку цифр в каждом окошечке всего две – 0 и 1 – он считает гораздо быстрее. Давайте попробуем записать результат такого счета, а параллельно будем считать привычным способом:
00000000 соответствует 0
00000001 1
Цифры в самом правом окошечке исчерпаны. Включается второе:
00000010 2
00000011 3
Цифры в двух правых окошечках исчерпаны. Начинает работать третье:
00000100 4
00000101 5
00000110 6
00000111 7
Далее четвертое, и т. д. Пока не дойдем до максимального числа
11111111. А что будет дальше? А то же, что бывает в обычном счетчике, когда он доходит до максимального числа 999999: после этого он обнуляется.
Убедитесь, что максимально возможное число в байте (11111111) будет соответствовать при обычном счете числу 255.
Если мы теперь задумаемся над тем, чему нас учили с первого класса школы (а кого-то и раньше!) и о чем нам напоминает обычный счетчик, мы увидим, что при счете у нас постоянно всюду присутствует число десять. Десять различных цифр, как только досчитали до десяти, переходим в следующий разряд и т.д. Что означает самое обычное число, скажем, 1945? 1 тысяча + 9 сотен + 4 десятка + 5 единиц. То есть, цифра, находящаяся левее на одну позицию, обозначает в десять раз большее число. В связи со всем этим говорят, что мы используем при счете десятичную позиционную систему счисления. Десятичную - потому, что мы при счете всюду натыкаемся на число десять. Позиционную – потому, что значение цифры в числе зависит от ее позиции – она может означать единицы, десятки, сотни и т.д.
А что же происходит с нашим байтом? Все то же самое, только два вместо десяти! Две различные цифры, до двух надо досчитать, чтобы перейти в следующий разряд, и т.д. Поэтому, система, на основе которой осуществляется счет в байте (читай – в компьютере!) называется двоичной позиционной системой счисления, или просто двоичной системой.
Продолжение следует.