logo
Назад

Теоретические основы информатики

Тема 1

01. Цели изучения курса информатики и ИКТ. Техника безопасности и организация рабочего места (полный урок)

12 мин

02. Общие сведения о системах счисления

21 мин

03. Двоичная система счисления. Двоичная арифметика

22 мин

04. Качественные и количественные характеристики информации

18 мин

05. Операции над двоичными числами. Измерение информации. Системы кодирования информации

7 мин

06. Защита информации. Информатизация и информационно-технологическая культура

07. Модели, их назначение, свойства и виды

9 мин

08. Информационные (нематериальные) модели. Компьютерное моделирование

22 мин

09. Восьмеричная и шестнадцатеричная системы счисления. Компьютерные системы счисления

19 мин

10. Перевод десятичных чисел в систему счисления с основанием Q. Арифметические действия в системах счисления

25 мин

11. Представление целых чисел. Представление вещественных чисел

32 мин

12. Элементы алгебры логики

19 мин

13. Логические операции. Таблицы истинности

36 мин

14. Логические операции следования и равносильности. Законы алгебры логики

18 мин

15. Решение логических задач

18 мин

16. Способы записи алгоритмов

24 мин

11. Представление целых чисел. Представление вещественных чисел

Видео доступно по абонементу

"

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


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

Пускай и не задумываясь об этом, эти первобытные люди научились устанавливать соответствия между количеством животных и знаками, которыми это число можно продемонстрировать. Первые скотоводы использовали числа для подсчёта голов в стаде, строители рассчитывали количество материала для возведения построек, а торговцы и путники подсчитывали количество дней в пути. Счёт применяется практически во всех сферах жизни человека, поэтому можно с уверенностью сказать, что числа являются одним из самых важных изобретений человечества.

Но с развитием цивилизации числа начали принимать всё новые и новые формы.
В какой-то момент стало понятно, что только целыми числами обойтись нельзя. Если разделить одно яблоко на несколько человек, то каждая часть этого яблока будет описываться частью от целого. Мы называем такое описание дробным, то есть мы дробим или разделяем что-то целое на части. Поделив яблоко на 5 человек, мы дадим каждому ⅕ часть.

Другим важнейшим изобретением человечества является десятичная система счисления. В древние времена существовали различные системы счисления: в Месопотамии шестидесятеричная, у индейцев Америки двадцатеричная. Но наиболее востребованной оказалась именно десятичная, поскольку она имела важные преимущества перед остальными. Счёт группами по 10 существенно упрощает вычисления: 10 единиц — десяток, 10 десятков — сотня, 10 сотен — тысяча. Она полностью позиционная в отличие от многих других, что позволяет всего десятью цифрами записать сколь угодно большое число.

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

При работе с дробями оказалось, что все эти же преимущества распространяются и на них тоже. Для записи дробей можно использовать десятичный вид, например 1/10 = 0,1. Десятичными дробями оказалось возможно записать и иррациональные числа — бесконечные десятичные дроби, в которых нельзя выделить период. Самое известное иррациональное число — число пи (…).

При таком многообразии видов чисел стало удобно группировать различные виды чисел в множества, причём каждое следующее множество расширяет предыдущее: натуральные числа включены в множество целых, они в свою очередь — в множество рациональных, затем вещественные и так далее. Подробнее с множествами чисел вы уже знакомились в курсе алгебры.

Разряд в любой позиционной системе счисления — позиция цифры в числе.

При этом одна и та же цифра в разных разрядах будет иметь разное значение. Разряды считаются справа налево. Например, в числе 1234 цифра 4 обозначает единицы, 3 — десятки, 2 — сотни, 1 — тысячи.
Для хранения числа в памяти компьютера используется двоичная система. В предыдущих уроках мы подробно разбирали, почему именно она. Если кратко, то наиболее удобным способом хранить состояние запоминающей ячейки является набор сигналов «есть ток» и «нет тока».
Для записи различных чисел в двоичном виде требуется разное количество разрядов. Например, число . Как мы видим из данного примера, для хранения одноразрядного десятичного числа может требоваться разное количество разрядов двоичного. Когда возникает необходимость описать словами количество разрядов числа, говорят о разрядности этого числа.

Разрядность числа — это количество символов, необходимых для записи числа в выбранной системе счисления.

Рассмотрим хранение чисел в памяти компьютера.
Как известно, память имеет ячейки, которые состоят из однородных элементов. В свою очередь, эти элементы имеют только два возможных устойчивых состояния — 0 и 1 соответственно. Каждый такой элемент хранит в себе 1 бит информации, то есть разряд двоичного числа.

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

Представьте ситуацию, что перед вами стоит задача передать два двоичных числа собеседнику, а его задача — перевести полученные данные в десятичные числа. Допустим, вы передаёте и . В двоичном виде эти числа представляются как и . При слиянии этих чисел в единое сообщение мы получим 10111. Как собеседник должен понять, какие числа вы ему передали? Ведь эти разряды можно разделить на и , что приведёт к неправильной интерпретации полученной информации.
На помощь нам приходит приём представления разрядов обоих чисел в виде групп с фиксированной длиной. Допустим, мы представляем каждое входное число в виде восьмиразрядных двоичных чисел. Для этого слева на свободные позиции будем записывать нули. В этом случае наши числа примут такой вид: и . Теперь, когда мы их объединим, мы получим одно шестнадцатиразрядное сообщение: 0000001000000111. Собеседник же, зная принцип формирования посылки с данными, легко сможет проделать обратную процедуру: сначала разделить всю входную посылку на группы по 8 разрядов, затем убрать слева незначащие нули и в конце перевести числа в десятичный вид, сохранив все значения в первоначальном виде.
Группируя двоичные разряды по 8, максимальным числом, которое мы сможем записать, будет . Если нам этого недостаточно, то разрядность двоичного числа нужно будет увеличить, причём тоже на 8 бит, ведь мы с собеседником уже умеем группировать по 8, и нам не придётся в этом случае кардинально переписывать наши алгоритмы. Если мы представим число в формате 2 байт, или 16 бит, то диапазон возможных чисел будет уже от 0 до 65 535.
Кстати, как вам уже известно, цвета в компьютерах кодируются с помощью трёх компонентов: красного, зелёного и синего. А каждый из них, в свою очередь, кодируется числами от 0 до 255, что даёт в итоге цветов.

Таким образом, с помощью 3 байт информации можно получить больше 16,5 млн цветов, что достаточно для отображения любой графической информации.
Если число на входе неотрицательное, то нам его удобно представлять в двоичном виде, как оно есть. Но если же оно может принимать отрицательные значения, нам придётся указывать его знак.

«Почему в 1 байте 8 бит?»

Определение длины байта в разные годы в разных сферах отличалось. Например, в первых реализациях телеграфной связи использовалась группировка по 5 бит. Её изобрёл французский инженер Жан Морис Эмиль Бодо. В честь него же, кстати, была названа единица скорости передачи символьной информации — бод.

Но 5-битная кодировка имела весьма существенное ограничение: с её помощью можно было закодировать только 32 символа. Количество символов, которое можно закодировать с помощью выбранной разрядности, вычисляется как , где n — минимальное количество состояний ячейки памяти, а m — разрядность. В нашем случае в ячейку памяти 1 бит можно записать два состояния, а разрядность равна 5, отсюда вычисляем . С помощью этого количества можно было закодировать 26 букв английского алфавита и 6 дополнительных символов, а вот для 10 цифр уже не хватало разрядности.
Впоследствии телеграфисты перешли на 6-битное представление данных. С его помощью можно было закодировать уже 64 различных символа, поскольку . Этого хватало на заглавные и строчные буквы английского алфавита, а также 10 цифр, но для знаков препинания оставалось всего два символа, поэтому со временем и от этого формата отказались в пользу более ёмкого.

В 1963 году в США появляется 7-битный стандарт кодирования символов алфавита, цифр и служебных знаков, а вместе с ним и таблица ASCII (American Standard Code For Information Interchange).

В 1964 году компания IBM выпустила компьютер IBM System/360, в котором информация представлялась уже в 8-битном формате. Благодаря распространению этого компьютера в мире 8-битный способ представления данных и стал мировым стандартом.

«Разрядность операционной системы»

Все мы неоднократно слышали, что у современных операционных систем и программ указывается разрядность. Для чего это нужно? В первую очередь чтобы показать, с каким максимальным объёмом оперативной памяти может работать то или иное приложение. Для примера можно представить следующее: если мы на компьютер с 8 ГБ оперативной памяти установим 32-битную операционную систему, то, к сожалению, она физически не сможет использовать больше 4 ГБ, соответственно, остальные будут просто простаивать.

Давайте рассчитаем, почему так. Разрядность 32 бита означает, что для адресации ячеек памяти используется 32 бита. Количество адресов ячеек памяти, которое можно закодировать с помощью этой разрядности, вычисляется как , где n — количество значений в 1 бите, а m — разрядность. Получаем адресов ячеек, или 4 гигабайта памяти.

Поэтому при покупке и настройке нового ПК обязательно обращайте внимание на разрядность операционной системы или приложения, которое вы захотите установить.

Для 64-битных приложений и операционных систем максимальный объём оперативной памяти составляет 16 эксабайт, или 16 млрд ГБ. Как думаете, существуют ли сейчас системы с таким объёмом оперативной памяти?

С положительными числами всё понятно — мы просто переводим их в двоичную систему и записываем в ячейки памяти. Но что делать, если число может быть отрицательным, то есть нужно учитывать его знак?
Попробуем представить, как могло бы выглядеть число – в двоичном виде.
Для хранения числа будет также использоваться 8 бит. В этом случае . Можем ли мы что-то сделать с таким представлением, чтобы число стало отрицательным? Мы можем, например, ввести правило, по которому старший разряд этого числа становится знаковым, а остальные не меняются. Примем, что 0 в знаковом разряде соответствует положительному числу, а 1 — отрицательному. Тогда –. Вроде бы просто, не так ли? Но что будет, если мы сложим столбиком положительную пятёрку и отрицательную, записанную по нашему правилу?

В таблице S = 5 + (–5) = 5 – 5.
При вычитании числа самого из себя должен получиться ноль. Но у нас получилось (–10). Получаем явное противоречие, нужно придумать другой способ кодировки знака числа.
Здесь на помощь приходит дополнительный код. Чтобы его получить, необходимо двоичное представление числа преобразовать сначала в обратный код путём инвертирования всех его битов (замены 0 на 1 и наоборот). Получим обратный код числа — все биты инвертированы. И затем прибавить по математическим правилам единицу к обратному коду: — это и будет дополнительный код.

И вот как раз в этом моменте кроется вся магия арифметики отрицательных двоичных чисел. Посмотрим на сумму и –, полученную по правилам дополнительного кода.

В этом случае мы действительно в результате получили 0.
Здесь важно понимать следующее: так как при сложении двух единиц в двоичной системе мы получаем 0 и в переполнении — 1, в итоговой сумме 5 и дополнительного кода (–5) будет не восемь нулей в разрядах, а фактически единица и восемь нулей: . Но у нас есть ограничение на разрядность — мы можем записать только восьмибитное представление числа, поэтому всё, что получилось за пределами 8 бит, мы просто отбрасываем. Таким образом, в сумме мы фактически получаем единицу и 8 нулей, но записываем только 8 нулей. Это правило сохраняется и для любой другой разрядности: 16, 24, 32, 64 бита и так далее. Это будет работать благодаря тому, что в формировании дополнительного кода числа участвуют абсолютно все биты в его записи, поэтому при сложении переполнение всегда будет выходить за пределы выбранной разрядности.
Вся элегантность дополнительного кода заключается в том, что для осуществления арифметических операций над отрицательными числами нам не нужно изобретать алгоритм вычитания, достаточно лишь применить суммирование по правилам, которые гораздо проще реализуются внутри процессора. Например, при вычитании столбиком, если в каком-то разряде нам не хватает значения, мы занимаем у следующих. Внутри вычислительного устройства этот алгоритм, конечно, можно реализовать, но гораздо проще, быстрее и эффективнее оказывается представление числа именно в дополнительном коде: разность двух чисел заменяется на сумму первого без изменений и дополнительного кода второго. Если мы работаем с двумя отрицательными числами, то для их сложения также необходимо сложить их дополнительные коды, ведь, например, –5 + (–3) = –5 — 3.
Если предполагается, что в ячейки памяти будет записано число, имеющее знак, то по умолчанию самый левый бит этого числа принимается за знаковый и в формировании самого числа не участвует.
Если знаковый бит равен единице, то число считается отрицательным и для его представления в десятичном виде используется обратный алгоритм формирования дополнительного кода: прибавить дополнительный код (–1), а результат инвертировать.
Поскольку знаковый бит не участвует в формировании числа, то диапазон возможных чисел, которые можно записать в знаковом формате, будет отличаться от беззнакового. В беззнаковом формате мы могли записать в 1 байт числа от 0 до 255 — всего 256 чисел. В знаковом формате же этот диапазон будет сдвинут таким образом, что ноль получится в его середине, а значений останется 256, в итоге получим диапазон от –127 до 127, но здесь кроется один нюанс — мы можем получить отрицательный ноль.

«Отрицательный ноль в информатике»

Представьте знаковое двоичное число 10000000. Единица в старшем разряде означает, что это число отрицательное, а значит, оно записано в дополнительном коде. Давайте переведём это число в прямой код. Для этого необходимо вычесть единицу из дополнительного кода и инвертировать биты.

При вычитании единицы из этого числа получим: . А при инвертировании битов получим опять число . То есть прямой и дополнительный код числа совпадают. Это число и называется отрицательным нулём в информатике.

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

Давайте подумаем, как бы мы хранили рациональные числа в памяти компьютера. Рациональные числа, как вы уже знаете из курса алгебры, представляются в виде обыкновенной дроби. Например, если три пирога разделить на 10 человек, каждый получит 3/10 части пирога. Что нам мешает хранить в памяти компьютера число в таком виде? Казалось бы, ничего: выделяем память под числитель, под знаменатель — и готово. Но давайте сравним два рациональных числа: и . Эти два числа равны 0,875. Чтобы это понять, нам нужно или сократить общие множители, или выполнить деление в столбик, что требует определённого времени. При этом для их хранения потребуется разное количество памяти, ведь 7 и 8 входят в диапазон значений 1 байта, а 43 750 и 50 000 не входят, им требуется больше памяти для хранения.

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

Согласитесь, гораздо удобнее использовать десятичные дроби для представления рациональных чисел. К тому же при использовании десятичных дробей можно не делать различие между рациональными и иррациональными числами. То есть числа и π не будут требовать различных схем хранения. Однако важно понимать, что с учётом ограничения разрядности мы не сможем представить в памяти компьютера бесконечное число знаков после запятой, а те разряды, которые не помещаются в выделенную область памяти, придётся откинуть. Тем не менее внутри компьютера все числа, которые могут иметь дробную часть, представляются в формате с плавающей запятой.

Но здесь появляется другая проблема. Например, число 2,5 в двоичном виде будет иметь 10 в целой части и 1 в дробной. На бумаге мы бы просто поставили запятую между ними, но как поставить запятую внутри ячейки памяти, которая, кроме логических нулей и единиц, ничего хранить не умеет?

Мы можем записать любое десятичное число в виде всех его значащих цифр без учёта запятой, а запятую, в свою очередь, обозначить или имитировать с помощью степени десятки, которую нужно умножить на само число.

Примеры:

Как видно из примеров, может потребоваться различное количество разрядов для записи одного и того же числа. А различное количество знаков в записи числа означает, что с такими числами будет сложнее оперировать при арифметических расчётах.

В этом случае поступим следующим образом: число будем представлять в стандартном виде (вы знаете про него из курса алгебры), то есть в виде десятичной дроби, у которой целая часть всегда лежит в диапазоне [1; 10).

Примеры:

В этих примерах очевидно удобство такой формы представления чисел: на хранение значащих цифр числа можно выделить одинаковое количество разрядов, как и на степень десятки, при этом саму десятку можно не записывать.

Таким образом, можно записать формулу для представления чисел в этом виде:

, где n — число, m — число в диапазоне [1; 10) — такое число будем называть нормализованным, k — степень десятки.

В свою очередь, m тоже необходимо описать двумя составляющими: m = a + b, где а — целая часть, b — дробная часть. В итоге число представляется в таком виде: . В памяти компьютера такое число можно хранить, выделяя разряды на каждую его составляющую, однако в этом случае максимально возможное число, хранимое в таком виде, определяется разрядностью его записи. Чем больше разрядов числа выделяется на хранение, тем большее число можно записать в эту область памяти. При этом чем больше разрядов выделяется на дробную часть, тем более точное значение мы сможем сохранить. Введя такой способ хранения чисел, мы подошли к термину «научная нотация записи числа».

В научной нотации любое число представляется в виде знака, мантиссы и порядка. Например, число .

Другой пример: . Научная нотация предполагает следующую запись: нормализованная мантисса, знак «е», отделяющий мантиссу от порядка, и сам порядок в виде степени основания системы счисления. Мантисса нормализуется с определённой целью — чтобы запятая всегда была в одной и той же позиции.

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

Но ведь можно поместить запятую не после первого значащего разряда, а в самый конец числа. При этом запятую вообще можно будет не писать, а в порядок также сохранить количество переносов. В этом случае область памяти можно разделить на части таким образом, чтобы в одной области хранилась мантисса без учёта запятой вообще, в другой — порядок, а в третьей — знак. Тогда, например, число 25,35610 будет храниться в таком виде:

  • знак равен 0;

  • мантисса равна 25 356;

  • порядок равен –3, что означает 10–3.

Если остаются незаполненные разряды в мантиссе или в порядке, то они заполняются нулями так, чтобы на значение числа это не влияло.

Рассмотрим ещё примеры. Для числа 0,005 нужно произвести нормализацию так, чтобы мантисса начиналась с первой значащей цифры. Мантисса будет равна 5. В порядок же необходимо записать то количество разрядов, на которое мы сдвинули запятую, то есть 3. Но так как запятая сдвигалась вправо, то порядок будет отрицательным и равным –3. Это означает, что для получения числа 0,005 необходимо число 5 разделить на или на 1000.

Теперь рассмотрим пример со сдвигом запятой влево. Для этого представим число 25 000. Его мантисса равна 25, а порядок в таком случае равен 3, то есть для получения числа 25 000 нужно взять число 25 и умножить на .

В двоичной системе счисления порядок представления числа в формате с плавающей запятой аналогичен. Рассмотрим на примере числа 5,5. В двоичном виде оно будет выглядеть так: 101,1. Его мантисса после нормализации будет равна 1011, а порядок (–1).

Существует стандарт IEEE 754, который описывает способ хранения числа с плавающей запятой в памяти компьютера. Согласно ему, на хранение такого числа в памяти может выделяться от 16 до 128 бит. Мы рассмотрим вариант, где выделяется 32 бита информации.

Знаковый бит равен единице для отрицательного числа и нулю для положительного. Далее 8 бит — порядок числа. Оставшиеся 23 бита выделены для хранения мантиссы.

Любопытный факт: если в знаковый бит записать единицу, а во все остальные — нули, то мы также получим отрицательный ноль.
Способ хранения числа в виде знака, мантиссы и порядка является своеобразным компромиссом между точностью и диапазоном принимаемых значений. Иррациональные числа, как и некоторые рациональные, могут иметь бесконечное число знаков после запятой. Однако же в память компьютера их приходится записывать в ограниченный диапазон бит, что приводит к отбрасыванию некоторой части этого числа. На бумаге, например, мы могли бы записать число в десятичном виде как 0,(3), но в памяти компьютера нам придётся отбросить те знаки дробной части, которые выходят за диапазон разрядности.

Теперь вы знаете, как хранятся числа в памяти компьютера.


Список использованных источников:

Изображения используются согласно лицензии Shutterstock / FOTODOM
Моушн-дизайнер Лопатин М. С

"

Обсуждение