Мегаобучалка Главная | О нас | Обратная связь


Представление данных в памяти компьютера



2019-11-13 416 Обсуждений (0)
Представление данных в памяти компьютера 0.00 из 5.00 0 оценок




Концепции типов данных

На уроке математики нас учили использовать разные виды чисел – натуральные числа, которые применяются при счете: 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

Для перевода числа из десятичной системы счисления в любую другую можно воспользоваться методом «деления уголком»

621 │2_  -620 │ 310 │2 _  1 -310 │ 155 │2_       0 -155 │ 77 │2_            1 -76 │ 38 │2 _                 1  -38 │ 19 │2 _                       0 -18 │ 9 │2 _                           1 -8 │ 4│2 _                               1 -4│ 2 │2 _                                   0 -2│ 1 │2 _                                      0 -0│0                                         1

Записав все остатки в обратном порядке, получим 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

Широкое использование восьмеричной и шестнадцатеричной системы в информатике и вычислительной технике обусловлено их тесной связью с двоичной. В частности, числа из восьмеричной системы и шестнадцатеричной системы легко можно переводить в двоичную форму, не выполняя никаких арифметических действий. Каждой восьмеричной цифре соответствует три двоичных (такие тройки называют триадами), а каждой шестнадцатеричной – четыре двоичных цифры (такие четверки называют тетрадами)

16 0 1 2 3 4 5 6 7 8 9 A B C D E F
2 0000 0001 0010 0011 0100 0101 0110 0111 1000 1001 1010 1011 1100 1101 1110 1111

Например, 25E016 = 00100101111000002.

8 0 1 2 3 4 5 6 7
2 000 001 010 011 100 101 110 111

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

Тип C++ Размер Представление в памяти Диапазон
unsigned  char 1 байт 00110101 0..255
unsigned  short 2 байта 00000000 00110101 0..65 535
unsigned  int 4 байта 00000000 00000000 00000000 00110101 0..4 294 967 295

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

С отрицательными числами дело обстоит несколько сложнее. Первая наиболее простая модель для хранения отрицательных чисел – прямой код подразумевает, что начальный бит является битом знака. Т.е. если 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.



2019-11-13 416 Обсуждений (0)
Представление данных в памяти компьютера 0.00 из 5.00 0 оценок









Обсуждение в статье: Представление данных в памяти компьютера

Обсуждений еще не было, будьте первым... ↓↓↓

Отправить сообщение

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



©2015-2024 megaobuchalka.ru Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. (416)

Почему 1285321 студент выбрали МегаОбучалку...

Система поиска информации

Мобильная версия сайта

Удобная навигация

Нет шокирующей рекламы



(0.007 сек.)