Вы помните из раздела 6.2, что двоичная цифра или бит может иметь одно из двух значений: либо 0, либо 1. В компьютере биты собраны в группы по восемь битов, а группа из восьми битов известный как байт. Для обозначения байта используется аббревиатура B, поэтому 512 байтов будут записаны как 512 B. Хотя в этом курсе для бита используется буква «b», а для байта — «B», следует помнить, что не все проводят четкое различие. р>
Байт данных может представлять множество разных вещей в компьютере. Например, байт может представлять текстовый символ, такой как буква «а», число, пробел или знак препинания. Просто чтобы дать вам представление о том, что это значит, скажу, что для фразы "технология хранения" потребуется 18 байт дискового пространства (есть 18 символов: 17 букв и один пробел).
Сколько байтов потребуется для хранения следующей фразы? информационные и коммуникационные технологии
11 + 3 + 13 + 12 для букв в словах + 3 для пробелов = 42 байта.
Емкость оперативной памяти компьютера измеряется в байтах. Компьютер может. например, иметь 512 мегабайт оперативной памяти. Из нашего обсуждения в Разделе 6.2 вы можете ожидать, что это будет 512 миллионов байт. К сожалению, все не так просто. Что касается размера памяти и файлов, мегабайт равен 1 048 576 байт, а не 1 000 000 байт! Точно так же килобайт — это 1024 байта, а не 1000, а гигабайт означает 1 073 741 824 байта, а не 1 000 000 000. Все эти числа являются «степенями 2», что означает 2, умноженное само на себя определенное количество раз. Вероятно, никто бы не стал определять таким образом размеры памяти и файлов, если бы сегодня все начиналось сначала, но существуют исторические причины, по которым размеры изначально определялись таким образом.
Как видно из таблицы 2, для слова "кило" следует использовать прописную букву "К", если это означает 1024. Это отличается от строчной буквы "к", которую вы встречали ранее применительно к скорости передачи данных, где "кило" означает 1000. (см. Таблицу 1). К сожалению, не все придерживаются этого правила, и нет такого различия между двумя версиями «мега» и «гига». Для этих префиксов всегда используются заглавные буквы M и G.
Префикс | На рисунках это: | Примерно: th> | Символ |
---|
кило | 1024 | Тысяча | К |
мега | 1 048 576 | Миллион | М |
гига | 1 073 741 824 | Миллиард (тысяча миллионов) | G |
< /таблица>
Золотое правило: кило, мега и гига имеют значения, указанные в таблице 2, если они относятся к памяти или размерам файлов; если они относятся к скорости передачи данных, то кило, мега и гига имеют значения, указанные в таблице 1.
Задание 10 (самооценка)
Если килобайт — это 1024 байта данных, сколько бит данных это представляет?
Ответить
В байте 8 бит, а "кило" здесь означает 1024. Таким образом, килобайт равен 1024×8=8192 бит.
Вероятно, вы знаете, что все на компьютере хранится в виде строк битов (двоичных цифр; вы можете думать о них как о множестве маленьких переключателей). Здесь мы объясним, как эти биты используются для представления букв и цифр, которые обрабатывает ваш компьютер.
Прежде чем мы приступим к этому, вам нужно понять размер слова вашего компьютера. Размер слова является предпочтительным размером компьютера для перемещения единиц информации; технически это ширина регистров вашего процессора, которые являются областями хранения, которые ваш процессор использует для выполнения арифметических и логических вычислений. Когда люди пишут о компьютерах с разрядностью (называя их, скажем, «32-битными» или «64-битными»), они имеют в виду именно это.
Большинство компьютеров теперь имеют размер слова 64 бита. В недавнем прошлом (начало 2000-х) многие ПК имели 32-битные слова. Старые машины 286 в 1980-х годах имели размер слова 16. В старых мейнфреймах часто использовались 36-битные слова.
Компьютер рассматривает вашу память как последовательность слов, пронумерованных от нуля до некоторого большого значения, зависящего от объема вашей памяти. Это значение ограничено размером вашего слова, поэтому программы на старых машинах, таких как 286, должны были пройти через болезненные искажения, чтобы адресовать большие объемы памяти. Я не буду описывать их здесь; они до сих пор вызывают кошмары у программистов постарше.
Целые числа представлены в виде слов или пар слов, в зависимости от размера слова вашего процессора. Одно 64-битное машинное слово является наиболее распространенным целочисленным представлением.
Целая арифметика близка к математической системе счисления по основанию два, но не совсем ей. Младший бит равен 1, затем 2, затем 4 и так далее, как в чистом двоичном коде. Но числа со знаком представлены в записи с дополнением до двух.Бит старшего разряда является битом знака, который делает величину отрицательной, и каждое отрицательное число может быть получено из соответствующего положительного значения путем инвертирования всех битов и добавления единицы. Вот почему целые числа на 64-битной машине имеют диапазон от -2 63 до 2 63 - 1. Этот 64-й бит используется для знака; 0 означает положительное число или ноль, 1 — отрицательное число.
Некоторые компьютерные языки предоставляют вам доступ к беззнаковым арифметическим операциям, которые представляют собой прямое основание 2 только с нулями и положительными числами.
Большинство процессоров и некоторые языки могут выполнять операции с числами с плавающей запятой (эта возможность встроена во все современные чипы процессоров). Числа с плавающей запятой дают гораздо более широкий диапазон значений, чем целые числа, и позволяют выражать дроби. Способы, которыми это делается, различны и слишком сложны, чтобы подробно обсуждать их здесь, но общая идея очень похожа на так называемую «научную нотацию», где можно записать, скажем, 1,234 * 10 23 ; кодирование числа разделено на мантисса (1,234) и экспоненциальную часть (23) для множителя степени десяти (что означает, что умноженное число будет иметь 20 нулей, 23 минус три десятичных знака).
Предыдущий абзац вводил в заблуждение по двум причинам. Второстепенным является то, что термин «октет» формально корректен, но на самом деле используется редко; большинство людей называют октет байтом и ожидают, что длина байта будет восемь бит. Строго говоря, термин «байт» является более общим; раньше были, например, 36-битные машины с 9-битными байтами (хотя, вероятно, их больше никогда не будет).
Главная из них заключается в том, что не во всем мире используется ASCII. На самом деле, большая часть мира не может - ASCII, хотя и подходит для американского английского, не имеет многих акцентированных и других специальных символов, необходимых пользователям других языков. Даже в британском английском есть проблемы с отсутствием знака фунта стерлингов.
Было несколько попыток решить эту проблему. Все они используют дополнительный старший бит, которого нет в ASCII, что делает его младшей половиной набора из 256 символов. Наиболее широко используемым из них является так называемый набор символов «Latin-1» (более формально называемый ISO 8859-1). Это набор символов по умолчанию для Linux, старых версий HTML и X. Microsoft Windows использует измененную версию Latin-1, которая добавляет набор символов, таких как правые и левые двойные кавычки, в тех местах, где правильный Latin-1 оставляет неназначенными для исторических данных. причинам (обзорный отчет о проблемах, которые это вызывает, см. на странице деморонизатора).
Latin-1 поддерживает западноевропейские языки, включая английский, французский, немецкий, испанский, итальянский, голландский, норвежский, шведский, датский и исландский. Однако этого тоже недостаточно, и в результате существует целая серия наборов символов от латиницы от 2 до -9 для обработки таких вещей, как греческий, арабский, иврит, эсперанто и сербско-хорватский. Подробности см. на странице супа с алфавитом ISO.
Наилучшее решение — огромный стандарт Unicode (и его аналог ISO/IEC 10646-1:1993). Unicode идентичен Latin-1 в самых нижних 256 слотах. Над ними в 16-битном пространстве он включает греческий, кириллический, армянский, иврит, арабский, деванагари, бенгальский, гурмукхи, гуджарати, ория, тамильский, телугу, каннада, малаялам, тайский, лаосский, грузинский, тибетский, японский Кана, полный набор современных корейских хангыль и единый набор китайских/японских/корейских (CJK) иероглифов. Дополнительные сведения см. на домашней странице Unicode. XML и XHTML используют этот набор символов.
Большинство из нас пишет числа в арабской форме, т. е. 1, 2, 3. 9. Некоторые люди пишут их по-другому, например, I, II, III, IV. IX. Независимо от того, какой тип репрезентации, большинство людей могут понять, по крайней мере, два типа, которые я упомянул. К сожалению, компьютер этого не делает. Компьютер — самая глупая вещь, с которой вы когда-либо сталкивались в жизни.
Современные компьютеры состоят из транзисторов. Всякий раз, когда электрический ток проходит через транзисторы, устанавливается состояние ON или OFF. Поэтому компьютер может распознавать только два числа: 0 для ВЫКЛ и 1 для ВКЛ, которые можно назвать БИТ. Между битом 0 и битом 1 ничего нет (например, бит 0,5 не существует). Следовательно, компьютеры можно назвать дискретными машинами. Система счисления, состоящая только из двух чисел, называется двоичной системой. А чтобы различать разные системы счисления, люди используют числа, т.е. 1,2,3,4. отныне будут называться Decimals (поскольку они основаны на 10 числах).
Как же тогда компьютер может понимать числа больше 1? Ответ прост, 2 — это просто 1+1 (например, 10 = 9+1 для человека), числа складываются, а лишняя цифра переносится в левую позицию. Таким образом, (десятичное) 2 представлено в двоичном виде как 10. Чтобы еще больше проиллюстрировать взаимосвязь, я перечислил числа от 1 до 9 в обеих системах для сравнения:
Десятичный | Двоичный |
0 | 0000 0000 |
1 | 0000 0001 |
2 | 0000 0010 |
3 | 0000 0011 |
4 | 0000 0100 |
5 | 0000 0101 |
6 | 0000 0110 |
7 | 0000 0111 |
8 | 0000 1000 |
9 | 0000 1001 |
< /таблица>
Вы можете спросить, почему я всегда ставлю 8 двоичных цифр. Что ж, наименьшая единица памяти компьютера для хранения данных называется БАЙТ, который состоит из 8 БИТОВ. Один байт допускает до 256 различных комбинаций представления данных (2 8 = 256). Что происходит, когда у нас есть числа больше 256? Компьютер просто использует больше байтов для хранения значения, 2 байта могут содержать значения до 65536 (2 16 ) и так далее.
ФОРМАТ ASCII
Компьютер не только не понимает (десятичные) числа, которые вы используете, он даже не понимает такие буквы, как "ABCDEFG. ". Дело в том, что это не волнует. Какие бы буквы вы ни вводили в компьютер, компьютер просто сохраняет их там и доставляет вам, когда вы ему это даете. Он сохраняет эти буквы в том же двоичном формате, что и цифры, в соответствии с шаблоном. В ПК (включая DOS, Windows 95/98/NT и UNIX) шаблон называется ASCII (произносится как ask-ee), что означает американскийамериканский Sстандарт Коддля Iинформации< /i> Яобмен.
В этом формате буква "А" представлена как "0100 0001" или, чаще всего, относится к десятичному числу 65 в таблице ASCII. Стандартная кодировка в ASCII здесь. При сравнении символов компьютер фактически ищет соответствующие коды ASCII и сравнивает значения ASCII вместо символов. Следовательно, буква "B" со значением ASCII 66 больше, чем буква "A" со значением ASCII 65.
Типы данных
Компьютер хранит данные в различных форматах или типах. Число 10 может быть сохранено как числовое значение, как в "10 долларах", или как символ, как в адресе "10 Main Street". Так как компьютер может сказать? Опять же, компьютеру все равно, вы несете ответственность за получение от него правильных данных. (Для иллюстрации символ 10 и цифра 10 представлены 0011-0001-0011-0000 и 0000-1010 соответственно — вы можете видеть, насколько они различаются.) Различные языки программирования имеют разные типы данных, хотя фундаментальные обычно очень похожи.
Базовые типы данных C++ (только для C++)
C++ имеет много типов данных. Ниже приведены некоторые основные типы данных, с которыми вы столкнетесь в этих главах. Обратите внимание, что существуют более сложные типы данных. Вы даже можете создавать свои собственные типы данных. Некоторые из них будут обсуждаться позже в этом руководстве.
ASCII-128–127
char в основном используется для хранения буквенно-цифровых символов (числа хранятся в символьной форме). Напомним, что символ хранится в виде ASCII-представления на ПК. ASCII от -128 до -1 не существует, поэтому char содержит данные от ASCII 0 (нулевой ноль) до ASCII 127 (клавиша DEL). Исходный C++ не имеет типа данных String (но string доступен через включение библиотеки — это будет обсуждаться позже). Строка может быть сохранена в виде одномерного массива (списка) с «нулевым нулем» (ASCII 0) в последней «ячейке» массива. Беззнаковый символ позволяет эффективно использовать расширенные символы ASCII, представляющие большинство специальных символов, таких как знак авторского права �, знак зарегистрированного товарного знака � и т. д., а также некоторые европейские буквы, такие как , и т. д. . Как char, так и unsigned char хранятся внутри как целые числа, поэтому их можно эффективно сравнивать (быть больше или меньше).
Всякий раз, когда вы пишете char (букву) в своей программе, вы должны заключать ее в одинарные кавычки. Когда вы пишете строки (слова или предложения), вы должны заключать их в двойные кавычки. В противном случае C++ будет рассматривать эти буквы/слова/предложения как лексемы (будет обсуждаться в главе 4). Помните, что в C/C++ все A, 'A', "A" разные. Первая буква А (без кавычек) означает переменную или константу (обсуждается в главе 4), вторая буква «А» (в одинарных кавычках) означает символ А, занимающий один байт памяти. Третий «A» (в двойных кавычках) означает строку, содержащую букву A, за которой следует нулевой символ, который занимает 2 байта памяти (используется больше памяти, если хранить в переменной/константе большего размера).См. следующие примеры:
letter = 'A';
выйти
int (целое число) представляет все не дробные действительные числа. Поскольку int имеет относительно небольшой диапазон (до 32767), всякий раз, когда вам нужно сохранить значение, которое может выйти за пределы этого предела, вместо этого следует использовать long int. Прелесть использования int заключается в том, что поскольку оно не имеет дробных частей, его значение является абсолютным, а вычисления int чрезвычайно точными. Однако обратите внимание, что деление int на другое может привести к усечению, например, int 10 / int 3 даст 3, а не 3,3333 (подробнее об этом). это будет обсуждаться позже).
float, с другой стороны, содержит дроби. Однако настоящие дробные числа невозможны в компьютерах, поскольку они являются дискретными машинами (они могут обрабатывать только числа 0 и 1, а не 1,5, 1,75 или что-то среднее между 0 и 1). Независимо от того, сколько цифр может отображать ваш калькулятор, вы не сможете получить результат 2/3 без округления, усечения или приближения. Математики всегда пишут 2/3 вместо 0,66666. когда им нужны ТОЧНЫЕ значения. Поскольку компьютер не может производить действительные дроби, возникает проблема значащих цифр. Для большинства приложений достаточно определенных значащих чисел. Например, когда вы говорите о деньгах, 99,99 доллара ничем не отличаются от 99,988888888888 долларов (округленные до цента); когда вы говорите о богатстве Билла Гейтса, не имеет смысла говорить 56 123 456 789,95 долларов вместо того, чтобы просто сказать примерно 56 миллиардов долларов (эти цифры не соответствуют действительности, я понятия не имею, сколько денег у Билла, хотя я бы хотел, чтобы он дал мне округление). ). Как вы можете видеть из приведенной выше таблицы, float имеет только 6 значащих цифр, поэтому для некоторых приложений этого может быть недостаточно, особенно в ароматических вычислениях, и в этом случае вы можете использовать double или даже long double для обработки чисел. Есть еще одна проблема с использованием float/double. Поскольку числа внутренне представлены как двоичные значения, всякий раз, когда дробное число вычисляется или преобразуется в/из двоичного, возникает ошибка округления/усечения. Так что если у вас есть float 0, прибавьте к нему 0.01 100 раз, затем минус 1.00 от него (см. коды здесь или получите исполняемые коды здесь), вы не получите 0 как должно быть , скорее вы получите значение, близкое к нулю, но не совсем равное нулю. Использование double или long double уменьшит ошибку, но не устранит ее. Однако, как я упоминал ранее, релевантность может не влиять на нашу реальную жизнь, просто означает, что вам может потребоваться проявлять осторожность при программировании с числами с плавающей запятой.
Есть еще один тип данных C++, который я здесь не включил, — тип данных bool (логический), который может хранить только значение 0 (ложь) или 1 (истина). Я буду использовать int (integer) для обработки логических сравнений, что создает больше проблем и разнообразия использования.
Escape-последовательности
Escape-последовательности не являются типами данных, но я думаю, что лучше обсудить их здесь. Я упоминал ранее, что вы должны включать ноль в конце «строки» при использовании массива символов для представления строки. Самый простой способ сделать это — написать escape-последовательность '\0', которая понимается C++ как нуль-ноль. Следующие Escape-последовательности в C++:
Seq | Значение | Последовательность | Значение | Seq | Значение |
\a | Тревога | \t | Вкладка | \" | Двойная кавычка |
\b | Backspace | \v | Вертикальная табуляция | \000 | Восьмеричное число< /td> |
\f | Поток страницы | \\ | Обратная косая черта | \xhh | Шестнадцатеричный номер |
\n | Новая строка | \? | Знак вопроса | \0 | Нулевой ноль |
\r | Возврат каретки | < td>\' Одинарная кавычка |
Определение типа
Ранее я говорил, что вы можете создавать свои собственные типы данных. Здесь я покажу вам, как это сделать. На самом деле вы можете не только создавать новые типы данных, но и создавать псевдонимы существующих типов данных. Например, вы пишете программу, которая работает с долларовыми значениями. Поскольку долларовые значения имеют дробные части, вы должны использовать типы данных с плавающей запятой или двойные (например, назначить тип данных с плавающей запятой для зарплаты, написав зарплату с плавающей запятой. Вы можете создать псевдоним того же типа данных ДЕНЬГИ и написать ДЕНЬГИ зарплата. Вы делаете это, добавляя следующее определение типа в вашу программу:
typedef double ДЕНЬГИ;
Вы также можете создавать новые типы данных. Я расскажу об этом подробнее, когда мы перейдем к массивам в главе 10. Ниже показано, как создать новый тип данных массива из базового типа данных:
Читайте также: