Представление данных в памяти компьютера
Концепции типов данных На уроке математики нас учили использовать разные виды чисел – натуральные числа, которые применяются при счете: 1, 2, 3... и т.д. Затем к ним добавились противоположные им (отрицательные) числа и ноль, расширив множество используемых чисел до целых. После чего последовало знакомство с дробями – рациональными числами и с иррациональными, что в итоге привелонас к множеству действительных чисел. При этом число в математике является чистой абстракцией, которой оперирует наше сознание. В отличие от представлений о числах, которые даёт нам математика, числовые величины (как и все остальные – текстовые, логические и пр.) в информатике имеют очень конкретное воплощение. Их необходимо хранить в ограниченной и дискретной[4] памяти компьютера. Немного о системах счисления 45 108 2 47 16 3 4 502 20 20 20! Цифровой стих Изучение систем счисления[5] как таковых, строго говоря, выходит за рамки данного пособия. Однако без их упоминания окажется невозможным как понимание различных типов данных, так и решение ряда рассматриваемых далее задач. Итак, мы используем десятичную позиционную систему счисления. Она называется так, потому что в ней имеется ровно 10 цифр[6] и величина, обозначаемая цифрой, зависит от позиции, в которой находится эта цифра. Например, в записи числа 333 имеется три тройки, первая из которых означает «3 сотни», вторая «3 десятка», а последняя «3 единицы». В качестве примера непозиционной системы счисления можно привести римскую. В записи числа XXXII каждая цифра X означает «десять», где бы она ни находилась. В дальнейшем мы будем рассматривать представление чисел только в позиционных системах счисления. Если для нашей системы счет ведётся 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20 … где 10 означает «1 десяток, 0 единиц», 11 – «1 десяток 1 единица» и т.д., то в восьмеричной системе он будет вестись 0, 1, 2, 3, 4, 5, 6, 7, 10, 11, 12, 13, 14, 15, 16, 17, 20, 21, 22 … где 10 означает «1 восьмёрка, 0 единиц», 11 – «1 восьмёрка 1 единица» и т.д. Таким образом, 248 = 2010 (запись 24 в восьмеричной системе соответствует записи 20 в десятичной) Для систем счисления с основанием, большим 10, как правило, в качестве недостающих цифр применяют латинские буквы. 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,A(10), B(11), C(12), D(13), E(14), F(15), 10, 11, 12, 13, 14, … Например, 3C означает «3 по шестнадцать и 12 по 1» или 60, а AE «10 по 16 и 14 по 1» или 174. При использовании большего количества цифр, можно воспользоваться аналогией с нашей собственной десятичной системой счисления: 35710 = 7×100 + 5×101 + 3×102 Т.е, последняя цифра соответствует 10 в нулевой степени (единицы), предпоследняя – 10 в первой степени (десятки) и т.д. Аналогично: 3578 = 7×80 + 5×81 + 3×82 = 23910 A2E16 = E×160 + 2×161 + A×162 = 14×160 + 2×161 + 10×162 = 260610 10011012 = 1×20 + 0×21 + 1×22 + 1×23 + 0×24 + 0×25 + 1×26 = 7710 Так же, как и в десятичной системе можно использовать числа с дробной частью: 1101.112 = 1×2-2 + 1×2-1 + 1×20 + 0×21 + 1×22 + 1×23 = 13.7510 Для перевода числа из десятичной системы счисления в любую другую можно воспользоваться методом «деления уголком»
Записав все остатки в обратном порядке, получим 62110=10011011012 Сам метод очень легко доказать: последняя единица была нами получена в результате 10 операций деления на 2, т.е. соответствует 210-1 = 29 степени, следующая – после 7 операций деления, т.е. соответствует 27-1 = 26 и т.д. Таким образом: Переведём это же число в шестнадцатеричную систему 621 │16_ -608 │ 38│16 _ 13 -32│ 2 │16 _ 6 -0│ 0 2 Т.е. 62110 = 26D16 Широкое использование восьмеричной и шестнадцатеричной системы в информатике и вычислительной технике обусловлено их тесной связью с двоичной. В частности, числа из восьмеричной системы и шестнадцатеричной системы легко можно переводить в двоичную форму, не выполняя никаких арифметических действий. Каждой восьмеричной цифре соответствует три двоичных (такие тройки называют триадами), а каждой шестнадцатеричной – четыре двоичных цифры (такие четверки называют тетрадами)
Например, 25E016 = 00100101111000002.
Например, 17028 = 0011110000102. Естественно, лидирующие нули в обоих приведённых примерах не играют роли и могут быть сокращены. Они приводятся для простоты понимания алгоритма. Кроме того, также легко можно переводить числа из двоичной в восьмеричную или шестнадцатеричную системы: 10110010111012 = 001 011 001 011 1012 = 131358 10110010111012 = 0001 0110 0101 11012 = 165D16 Представление данных в памяти компьютера В современных компьютерах минимальной адресуемой ячейкой оперативной памяти является байт[7]. В последующем для нас будет удобно представлять абстрактно модель памяти компьютера в виде ленты с ячейками ёмкостью 1 байт
Машинное слово - представляет собой максимальную последовательность единиц информации, которая обрабатывается, как одно целое. Длина слова соответствует разрядности процессора, которая на протяжении длительного времени была равна 16 бит. В большинстве современных компьютеров она составляет 64 бита, хотя встречаются и более короткие (32 бита), и более длинные машинные слова. При этом число бит, образующих машинное слово, всегда кратно восьми и может быть легко переведено в байты. Поскольку байт составляет 8 бит, а каждый бит принимает 2 возможных значения (0 и 1), следовательно,байт имеет 256 разных состояний, описываемых числами от 0 до 255 0 – 00000000 1 – 00000001 2 – 00000010 3 – 00000011 4 – 00000100 … 254 – 11111110 255 - 11111111 Целые числа Величины в памяти компьютера удобно описывать количеством байт, являющимся степенью 2 – т.е. 1, 2, 4, 8. Проще всего это сделать для беззнаковых целых величин – не предусматривающих возможность хранения отрицательных чисел. Так число 53, которое в двоичной системе записывается 110101, в формате беззнаковых целых будет выглядеть:
и т.д. В последнем столбце указывается, какой диапазон значений может принимать беззнаковая целая величина соответствующего размера. Максимальную величину посчитать достаточно просто, заменив значения всех битов единицами. С отрицательными числами дело обстоит несколько сложнее. Первая наиболее простая модель для хранения отрицательных чисел – прямой код подразумевает, что начальный бит является битом знака. Т.е. если 53 в однобайтном представлении выглядит 00110101, то -53 будет записано как 10110101. Единица в начальном бите означает, что число берётся со знаком «минус». Однако эта модель представления отрицательных чисел неудобна как для выполнения арифметических действий (сложение и т.д.), так и представлением нуля. В самом деле, 00000000 – это «плюс ноль», а 10000000 – это «минус ноль». Поэтому чаще используется модель дополнительного кода. Строится она для представления –Х неотрицательного Х следующим образом: все биты двоичного представления числа Х инвертируются, а затем добавляется единица. Например, для знакового однобайтного представления -53, берем двоичную запись 53 (00110101), инвертируем – 11001010. Затем добавляем 1, что даёт 11001011. Эта модель намного удобнее. Например, если нужно сложить знаковое однобайтное число 53 с противоположным ему числом -53: 00110101 (53) +11001011 (-53) 1 00000000 (1 выходит за границы 8 бит и не учитывается, т.е. 0) Таким образом, для знакового однобайтного целого диапазон возможных значений составляет -128 (10000000) .. +127 (01111111) для двухбайтного знакового -32768 (1000000000000000) .. +32767 (0111111111111111) и т.д. Вещественные числа Для выполнения научных расчётов в физике, астрономии, биологии, информатике оказывается удобной так называемая научная форма записи чисел (научная нотация). Выглядит она следующим образом: 653 = 6,53 × 102 7 = 7,0 × 100 0,0412 = 4,12 × 10-2 -14,798 = -1,4798 × 101 Т.е. одна ненулевая цифра выносится перед запятой, остальные после. Эта часть называется мантиссой. Она умножается на 10 в степени, называемой порядком числа. Так, часто в жизни мы говорим «это на порядок меньше», не всегда осознавая смысл данной фразы. Математически это можно записать так:
где R – число, M – мантисса, P – порядок, s – знак числа (1 для отрицательных, 0 для неотрицательных) В памяти компьютера такие величины обычно представлены в виде чисел с одинарной точностью (4 байта), двойной точностью (8 байт) и длинные вещественные[8] (12 байт).
Величины типа float занимают 4 байта, из которых один двоичный разряд отводится под знак мантиссы, 8 разрядов под порядок и 23 под мантиссу. Для величин типа double, занимающих 8 байт, под порядок и мантиссу отводится 11 и 52 разряда соответственно. Длина мантиссы определяет точность числа, а длина порядка – его диапазон. ВАЖНО: Резюмируя сказанное в этой части главы, следует отметить, что наши представления о величинах с точки зрения информатики и с точки зрения математики существенно различаются. Например, для математики величины 5 и 5.0 полностью эквивалентны, но в информатике они хранятся и обрабатываются по-разному. И мы полагаем 5.0 вещественным числом, несмотря на то, что с математической точки зрения оно целое. Кроме того, появляются концепции длинных целых, коротких целых и т.д., поскольку на объём памяти компьютера накладываются физические ограничения, отсутствующие в идеализированном математическом представлении. Всё это подводит нас к понятию типов данных, рассматриваемых далее. Типы данных Переменные Переменная (в программировании) – это адресуемая область памяти, имеющая собственное имя, которая может хранить некоторое значение, определяемое её типом. Прежде, чем использовать какую-либо переменную в программе, ее нужно объявить. Объявить - значит определить тип и присвоить имя. Тип данных в языке программирования определяет: 1. Формат представления в памяти компьютера – сколько байт памяти величина занимает, и как она обрабатывается 2. Множество допустимых значений, которые может принимать принадлежащая к выбранному типу переменная или константа 3. Множество допустимых операций, применимых к этому типу. 1.3.2 Основные типы данных в C++ int — целочисленный тип данных. float — тип данных с плавающей запятой. double — тип данных с плавающей запятой двойной точности. char — символьный тип данных. bool — логический тип данных. При объявлении переменной в C++ сначала указывается тип данных этой переменной, а затем название этой переменной. Пример int a; // объявление переменной a целого типа. float b; // объявление переменной b типа данных с плавающей запятой. double c = 14.2; // инициализация переменной типа double. char d = 's'; // инициализация переменной типа char. bool k = true; // инициализация логической переменной k. Служебное слово unsigned позволяет объявить переменную как беззнаковую. Например, unsigned int соответствует беззнаковому целому длиной 4 байта. ВАЖНО: В задачах, где требуется большая точность вычислений, из стандартных типов удобно брать long long для знаковых целых (8 байт), unsigned loglong для беззнаковых целых (8 байт) и long double для вещественных (10 байт) Литерал (англ. literal — константа) —фиксированное значение, включаемое непосредственно в код программы. Литералы в языке C++ могут быть целые, вещественные, символьные и строковые. 1. Целые: а). десятичные: 10, 132, -32179; б). восьмеричные (предваряются символом «0»): 010, 0204, -076663; в). шестнадцатеричные (предваряются символами «0х»): 0хА, 0x84, 0x7db3. 2. Вещественные: 15.75, 1.575e1, .75, -.125 3. Символьные: 'a', 'e', '.', '?', '2'. 4. Строковые: "строка". ВАЖНО: Используя различные типы данных C++, не забывайте, что каждый из них имеет свои ограничения. Иначе это может привести к непредсказуемым последствиям. Например, #include <iostream> int main(){ int x = 2147483647; std::cout << x + 1; } программа выведет число -2147483648. А программа #include <iostream> int main() { float x = 1e+200 * 1e+200; std::cout << x; } выведет inf, что означает infinity (англ. беЗконечность[9]). Структура программы Алфавит (множество символов) языка C++ включает: 1. прописные буквы латинского алфавита; 2. строчные буквы латинского алфавита; 3. арабские цифры; 4. разделители: , . ; : ? ! ' " | / \ ~ _ ^ ( ) { } [ ] <> # % & - = + * Остальные символы могут быть использованы только в символьных строках, символьных константах и комментариях. Язык C++ различает большие и маленькие буквы, таким образом, name и Name – разные идентификаторы. Для разделения логических строк программы используется точка с запятой. Программа на языке С++ состоит из функций, описаний и директив препроцессора. Одна из функций должна иметь имя main.
Популярное: Модели организации как закрытой, открытой, частично открытой системы: Закрытая система имеет жесткие фиксированные границы, ее действия относительно независимы... Как вы ведете себя при стрессе?: Вы можете самостоятельно управлять стрессом! Каждый из нас имеет право и возможность уменьшить его воздействие на нас... Организация как механизм и форма жизни коллектива: Организация не сможет достичь поставленных целей без соответствующей внутренней... ©2015-2024 megaobuchalka.ru Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. (416)
|
Почему 1285321 студент выбрали МегаОбучалку... Система поиска информации Мобильная версия сайта Удобная навигация Нет шокирующей рекламы |