Статья
Версия для печати
Обсудить на форуме (1)
Внутренняя форма представления данных в компьютере и недесятичные системы счисления.


1. Хранение данных


Любой программист рано или поздно сталкивается с проблемой хранения данных в компьютере. Как именно хранятся данные? В чем разница между типами данных? Что происходит, когда один тип преобразуется в другой? Наконец, почему иногда в программах 120+10 дает 130, а иногда - -126??? В зависимости от решаемых задач, языков программирования, собственной лени начинающий программист может какое-то время избегать поисков ответов на поставленные выше вопросы, но, в конце концов, уйти от них ему не удастся (если, конечно, он не переквалифицируется в управдомы или агенты по продаже недвижимости!). Если вы уже осознали необходимость во всем этом разобраться, предлагаемая статья должна вам помочь.

Итак, вопрос: как хранятся данные в компьютере? Давайте для простоты начнем наше рассмотрение с чисел. Мы уже знаем, что числа хранятся в ячейках-байтах. Теперь давайте посмотрим, как они там хранятся.
Ответьте сами себе на вопрос: для чего нужно хранить информацию? Вероятнее всего, ваш ответ будет звучать как-то вроде «для того, чтобы ее можно было получить, когда она потребуется». Причем, получить информацию может как тот, кто ее сохранил (вы записали номер телефона в записной книжке, чтобы не забыть), так и другие (вы записали номер телефона и передали его кому-то).

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

Задание 1.

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

Надеюсь, что вы действительно выполнили или, по крайней мере, попытались выполнить это задание, прежде, чем читать дальше.
Первый, для многих интуитивный ответ «пять» (или даже «шесть» - все разогнуты соответствует 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 возможных чисел и называется байт.


2. Десятичная и двоичная системы счисления.


Ну хорошо, есть у нас байт, и хранится в нем какая-то комбинация из восьми нулей и единиц, скажем, 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: после этого он обнуляется.

Задание 2.

Убедитесь, что максимально возможное число в байте (11111111) будет соответствовать при обычном счете числу 255.

Если мы теперь задумаемся над тем, чему нас учили с первого класса школы (а кого-то и раньше!) и о чем нам напоминает обычный счетчик, мы увидим, что при счете у нас постоянно всюду присутствует число десять. Десять различных цифр, как только досчитали до десяти, переходим в следующий разряд и т.д. Что означает самое обычное число, скажем, 1945? 1 тысяча + 9 сотен + 4 десятка + 5 единиц. То есть, цифра, находящаяся левее на одну позицию, обозначает в десять раз большее число. В связи со всем этим говорят, что мы используем при счете десятичную позиционную систему счисления. Десятичную - потому, что мы при счете всюду натыкаемся на число десять. Позиционную – потому, что значение цифры в числе зависит от ее позиции – она может означать единицы, десятки, сотни и т.д.

А что же происходит с нашим байтом? Все то же самое, только два вместо десяти! Две различные цифры, до двух надо досчитать, чтобы перейти в следующий разряд, и т.д. Поэтому, система, на основе которой осуществляется счет в байте (читай – в компьютере!) называется двоичной позиционной системой счисления, или просто двоичной системой.

Продолжение следует.


Автор: Sashok Sam
Версия для печати
Обсудить на форуме (1)