Скачать презентацию Типы данных n Всякая программа предназначенная для реализации Скачать презентацию Типы данных n Всякая программа предназначенная для реализации

L2_1 Типы данных.ppt

  • Количество слайдов: 45

Типы данных n Всякая программа, предназначенная для реализации на компьютере, представляет собой формализованное описание Типы данных n Всякая программа, предназначенная для реализации на компьютере, представляет собой формализованное описание алгоритма решения той или иной задачи n Действия, выполняемые программой в соответствии с этим алгоритмом, направлены на преобразование некоторых объектов, определяющих текущее состояние процесса решения задачи n Такие внутренние объекты программы принято называть данными n Для хранения всякого элемента данных исполняющая система выделяет необходимое пространство в оперативной памяти компьютера, размер которого называется длиной этого элемента

n n n Важнейшей характеристикой любого элемента данных является его тип Типом данных называется n n n Важнейшей характеристикой любого элемента данных является его тип Типом данных называется определение некоторой структуры данных, формы ее представления в памяти и набора возможных операций с ней Понятие типа включает в себя следующую информацию об элементе данных: q допустимый набор значений, которые объект этого типа может принимать в процессе работы программы (совокупность всех указанных значений мы будем называть областью определения типа) q состав операций, которые разрешено выполнять над объектами данного типа q способ представления элемента данных рассматриваемого типа в памяти машины q правила выполнения всякой операции из допустимого для этого типа набора операций

n Данные, обрабатываемые средствами языка Си, могут иметь различную структуру, формы представления в компьютере n Данные, обрабатываемые средствами языка Си, могут иметь различную структуру, формы представления в компьютере n Имеются типы данных, для которых формы представления и операции над ними реализованы в самом процессоре. Такие типы данных в Си называются базовыми n Другие типы данных, хотя и определяются в языке, но реализуются программно, через последовательность машинных команд или процедур n И, наконец, программист имеет возможность сам сконструировать производный тип данных средствами языка Си, написать набор операций (процедур) для работы с ним. В языке Си++ имеется возможность даже включить этот тип в перечень базовых типов данных и определить для него стандартные операции

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

n n n Байт - машинное слово минимальной размерности, адресуемое в процессе обработки данных. n n n Байт - машинное слово минимальной размерности, адресуемое в процессе обработки данных. Размерность байта - 8 бит - принята не только для представления данных в большинстве компьютеров, но и в качестве стандарта: n для хранения данных на внешних носителях; n для передачи данных по каналам связи; n для представления текстовой информации. Каждый байт кодирует один символ текста; n для определения размерности машинных слов. Размерность машинного слова выбирается кратной байту. Стандартное машинное слово - машинное слово, размерность которого совпадает с разрядностью процессора. Для компьютеров типа IBM/PC размерность слова - 16 бит (или 2 байта). Машинное слово двойной длины (двойное слово) - используется для увеличения диапазона представления целых чисел. Двойные слова обрабатываются либо некоторыми командами процессора, либо программно. Для компьютеров типа IBM/PC размерность двойного слова - 32 бита (или 4 байта)

Описание данных в программе n Те элементы данных, которые сохраняют неизменные значения на протяжении Описание данных в программе n Те элементы данных, которые сохраняют неизменные значения на протяжении всего времени работы программы, принято называть константами n Другие же объекты, являющиеся предметом изменения в ходе выполнения алгоритма, называют переменными

n Переменной в языке Си называется область памяти для хранения данных, имеющая имя и n Переменной в языке Си называется область памяти для хранения данных, имеющая имя и некоторую внутреннюю структуру (тип данных) n Любая переменная, которая используется в программе, должна быть определена n В процессе анализа определения переменной транслятором выполняются следующие действия: q q q вводится имя переменной, которое используется для обращения к ней в программе задается тип данных (структура данных), к которому относится переменная определяется начальное значение переменной (инициализация) транслятором распределяется память в программе для размещения переменной определяются характеристики переменной, которыми она будет обладать в программе (область действия, время жизни)

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

n В Си все переменные до их использования должны быть описаны n При определении n В Си все переменные до их использования должны быть описаны n При определении переменной должны быть заданы тип данных, имя переменной и, возможно, начальное значение n Описание задает тип, а затем идет список одной или более переменных этого типа

n Язык Си обеспечивает возможность представления и обработки данных следующих основных типов: q q n Язык Си обеспечивает возможность представления и обработки данных следующих основных типов: q q q целые числа различной длины со знаком и без символы, представимые в формате стандарта ASCII вещественные числа различной длины

n Ключевые слова unsigned, short и long могут быть использованы как модификаторы основных типов n Ключевые слова unsigned, short и long могут быть использованы как модификаторы основных типов данных при построении производных типов. Например, следующие описания рассматриваются компилятором как эквивалентные: n short int. . . . short long int. . . . long unsigned int. . . unsigned short int. . . . unsigned short unsigned long int. . . . unsigned long signed char. . . char signed int. . . . int signed short. . . short signed long. . . long

n Рассмотрим некоторые примеры описания данных в программе n int a, b, c; float n Рассмотрим некоторые примеры описания данных в программе n int a, b, c; float alpha, beta; int lower, upper, step; char c, line[512]; n n

Поскольку внутренние машинные представления данных одних и тех же типов для различных компьютеров могут Поскольку внутренние машинные представления данных одних и тех же типов для различных компьютеров могут быть различными, то возникают определенные трудности при необходимости обеспечить надлежащую мобильность программного обеспечения. Так, например, всякая переменная типа int на машинах IBM PC занимает два байта памяти, в то время как для ее представления на компьютерах VAX-11 требуется четыре байта n Преодолеть возникающие при этом трудности можно, используя, где это необходимо, операцию определения количества памяти, требуемой для представления некоторой переменной или какоголибо типа. В общем случае эта операция выглядит следующим образом: sizeof(name) n где name есть либо идентификатор переменной, либо имя типа данных. В следующем примере a = sizeof(int); n переменная a принимает значение, равное количеству байт памяти, требуемых для представления любой величины типа int, на конкретном компьютере n

n Переменным в описаниях можно задавать начальные значения (инициировать). Это можно сделать, вводя инициализирующие n Переменным в описаниях можно задавать начальные значения (инициировать). Это можно сделать, вводя инициализирующие выражения непосредственно в инструкции описания переменных char backslash = '\'; int i=0; long day = 60*24; int ndigit[10]= { 0, 0, 0, 0}; int mas[] = { 1, 2, 3 }; n В последнем примере длина массива определяется по числу инициализирующих значений. Если размер любого типа пропущен, то транслятор определяет его длину, считая инициирующие значения

n Для символьных массивов существует специальный способ инициации без скобок и запятых char pattern[] n Для символьных массивов существует специальный способ инициации без скобок и запятых char pattern[] = "the"; n Это сокращение более длинного, но эквивалентного описания char pattern[] = {'t', 'h', 'e', ''}; n n В первом случае длина массива полагается равной количеству символов в строке плюс один, а во втором равна количеству элементов в списке инициализации. В данном конкретном случае размер равен 4 (3 символа плюс закрывающий ) С другой стороны, описание char line[80] = "This is a string"; n объявляет массив, состоящий из 80 элементов типа char, но лишь 16 из них отличны от нуль-символа

1. Целые числа без знака n Числа без знака - это положительные числа n 1. Целые числа без знака n Числа без знака - это положительные числа n Для кодировки используется все разряды машинного слова n Ключевое слово unsigned используется как модификаторы основных типов данных unsigned int b; unsigned int a;

n Байт (unsigned char) 7 6 5 4 3 2 1 0 0 1 n Байт (unsigned char) 7 6 5 4 3 2 1 0 0 1 1 0 1 Значение в 10 -ой системе счисления = 1 + 4 + 8 + 64 = 87 Значение в 8 -ой системе счисления = 0115 (начинается с 0) Значение в 16 -ой системе счисления = 0 x 4 D (начинается с 0 x) Максимальное значение: 1 1 1 1 = 255 = 0377 = 0 x. FF Минимальное значение: 0 0 0 0 = 0

n Слово (unsigned int) 15 14 13 12 11 10 9 8 7 6 n Слово (unsigned int) 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 0 1 1 1 0 0 n в 8 -ой системе = 0 x 66714 в 16 -ой системе = 0 x 6 DCC n Максимальное значение: n 11111111 = +65535 = 0177777 = 0 x. FFFF n Минимальное значение: 00000000 = 0

Двойное слово (unsigned long int) Максимальное значение: 11111111 = +4294967297=0377777=0 x. FFFF Минимальное значение: Двойное слово (unsigned long int) Максимальное значение: 11111111 = +4294967297=0377777=0 x. FFFF Минимальное значение: 00000000 = 0

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

n Дополнительный код используется для представления целых отрицательных чисел. Это позволяет вместо операции вычитания n Дополнительный код используется для представления целых отрицательных чисел. Это позволяет вместо операции вычитания использовать обычное сложение, что упрощает конструкцию процессора n При создании арифмометра Паскаль столкнулся с определенной трудностью: изобретенный им механизм переноса десятков работал при вращении счетных колес только в одном направлении, а это не позволяло производить вычитание вращением колес в противоположную сторону. Паскаль заменил вычитание сложением с дополнением вычитаемого. Для 8 -разрядной машины, работающей в десятичной системе, дополнением числа А будет число (100 000 А), поэтому операция вычитания В-А может быть заменена сложением: B + (100 000 - A) = 100 000 + (B-A) n Получившееся число будет больше искомой разности на 100 000, но единица в 9 разряде просто пропадает при переносе десятков из восьмого.

n Алгоритм перевода отрицательного числа в дополнительный код следующий: q q n каждая цифра n Алгоритм перевода отрицательного числа в дополнительный код следующий: q q n каждая цифра отрицательного числа заменяется на дополнение ее до n-1, где n - основание системы счисления, т. е. на цифру, которая в сумме с исходной дает n-1 к полученному числу добавляется 1 Такое представление чисел со знаком называется дополнительным кодом. При сложении чисел со знаком, представленных в дополнительном коде, результат получается также в дополнительном коде. При этом операция выполняется по правилам сложения целых без знака

Пример в десятичной системе счисления: 512 - 386 = 126 Переведем отрицательное 386 в Пример в десятичной системе счисления: 512 - 386 = 126 Переведем отрицательное 386 в дополнительный код n - 3 8 6 - отрицательное число 1 6 1 3 - дополнение каждой цифры до 9 1 6 1 4 - добавление 1 Знак учитывается как (+, -) - (0, 1). Теперь разность 512 -386 можно заменить суммой 0 5 1 2 + 1 6 1 4 ------ 2 1 2 6 Поскольку разряд (2 в двоичной системе 10) вышел за пределы разрядной сетки – переполнение. Поэтому число 1 2 6 – положительное Ответ: 512 - 386 = 0126 = +126

n Другой пример в десятичной системе счисления: 119 – 386 0 1 1 9 n Другой пример в десятичной системе счисления: 119 – 386 0 1 1 9 + 1 6 1 4 - 386 в дополнительном коде ------- (01) 1 7 3 3 n Знаковый разряд отрицателен (1 в двоичной форме - 01), число отрицательно, следовательно результат представлен в дополнительном коде. Его надо перевести в обычный вид 7 3 3 + 2 6 6 - дополнение каждой цифры до 9 2 6 7 - добавление 1 Ответ: Учитывая знаковый разряд: 119 - 386 = -267

n В двоичной системе счисления дополнение каждой цифры заменяется инвертированием двоичного разряда, а с n В двоичной системе счисления дополнение каждой цифры заменяется инвертированием двоичного разряда, а с учетом представления знака старшим разрядом получается простой способ получения представления отрицательного числа: n взять абсолютное значение числа в двоичной системе n инвертировать все разряды, включая знаковый n добавить 1 n Ту же самую последовательность операций нужно выполнить, чтобы получить из дополнительного кода абсолютное значение отрицательного числа. Примеры: n 0 0000 0010 0101 - прямой код числа +35 1 1111 1101 1010 - инверсия всех бит (обратный код) + 0 0000 0001 - добавляем единицу мл. разряда --------------------- 1 1111 1101 1011 - дополнительный код числа (-35) F F D B - FFDB h - 16 -ричная запись

 0000 0110 1101 1000 - 0 x 06 d 8 - прямой код 0000 0110 1101 1000 - 0 x 06 d 8 - прямой код отрицательного числа 1111 1001 0010 0111 - 0 xf 927 - обратный код 1111 1001 0010 1000 - дополнительный код F 9 2 8 - 0 x. F 928 - 16 -ричная запись

n Целые со знаком могут быть q q q Байтовые (char - 1 байт) n Целые со знаком могут быть q q q Байтовые (char - 1 байт) Целые (int - 2 байта) Целые двойной длины (long int - 4 байта) char Максимальное значение: 01111111 = +127 Минимальное значение: 1111 = -128 int Максимальное значение: 011111111 = +32767 Минимальное значение: 11111111 = -32768 long Максимальное значение: 01111111111111111 = +2147483647 Минимальное значение: 1111111111111111 = -2147483648

0 0 0000 1 0000 0001 +32767 0 x 7 FFF 0111 1111 -1 0 0 0000 1 0000 0001 +32767 0 x 7 FFF 0111 1111 -1 0 x. FFFF 1111 -2 0 x. FFFE 1111 1110 -16 0 x. FFF 0 1111 0000 -32767 0 x 8001 1000 0000 0001 При такой системе кодирования нуль представить можно в двух вариантах 0 0000 -0 0 x 8000 1000 0000 n n Для избежания неоднозначности - вторая комбинация (0 x 8000) запрещена. Таким образом диапазон изменений целого со знаком -32768 до 32767

2. Символы, представимые в формате стандарта ASCII n Символы представляются числом размером 1 байт 2. Символы, представимые в формате стандарта ASCII n Символы представляются числом размером 1 байт (8 бит). В одном байте можно записать число от 0 до 255 n ASCII (American Standard Code for Information Interchange — американский стандартный код для обмена информацией. ASCII представляет собой 7 -битную кодировку для представления десятичных цифр, латинского и национального алфавитов, знаков препинания и управляющих символов. n На подавляющем большинстве современных компьютеров минимально адресуемая единица памяти — 8 -битный байт, поэтому там используются 8 -битные, а не 7 -битные символы. Обычно символ ASCII расширяют до 8 бит, просто добавляя нулевой бит в качестве старшего.

Таблица кодов ASCII Таблица кодов ASCII

n В компьютерах обычно используют 8 -битные расширения ASCII n История русских кодировок — n В компьютерах обычно используют 8 -битные расширения ASCII n История русских кодировок — это пример неразберихи, редкостной даже для нашей компьютерной действительности. Советские стандартизирующие организации принимали ГОСТы, производители компьютеров (Apple) и операционных систем (Microsoft) их дружно игнорировали и вводили собственные кодировки. n В результате мы получили наследство из четырех разных ГОСТов, две кодировки от Microsoft (для DOS и для Windows) и кодировку от Apple для Mac'ов (все, естественно, несовместимые между собой).

n К счастью, сегодня нет нужды подробно описывать все эти кодировки, поскольку в Рунете n К счастью, сегодня нет нужды подробно описывать все эти кодировки, поскольку в Рунете выжили только две из них. n Первая — это КОИ 8 -Р (КОИ означает Код для Обмена и обработки Информации, Р отличает русскую кодовую таблицу от украинской, КОИ 8 -У). КОИ 8 -Р была зарегистрирована Андреем Черновым из Релкома в качестве RFC 1489 и имеет вид:

n КОИ 8 -Р является стандартом de facto для всех служб Интернета, кроме WWW. n КОИ 8 -Р является стандартом de facto для всех служб Интернета, кроме WWW. В частности, все службы электронной почты и новостей Рунета работают в этой кодировке. n Что касается Веба, то здесь ситуация сложнее. Дело в том, что более 90% клиентских компьютеров Сети работает под управлением Windows разных версий. Windows использует собственную кодировку русских букв, которую принято назвать по номеру кодовой страницы Windows-1251 или CP 1251:

n Символьные константы состоят из одного символа кода ASCII, заключенного в апострофы ’A’ ’s’ n Символьные константы состоят из одного символа кода ASCII, заключенного в апострофы ’A’ ’s’ n Строки символов это массивы байтовых чисел - символов ASCII, заключенных в двойные кавычки. Транслятор помешает в конец каждой строки нулевой байт ”This is a character string” ”A” ” 1234”

3. Числа с плавающей точкой Для использования чисел с дробной частью, а также для 3. Числа с плавающей точкой Для использования чисел с дробной частью, а также для расширения диапазона их представления вводится форма представления чисел с плавающей точкой n Как известно, любое число можно представить в виде X=m*10 в степени p, n где 0. 1 < m < 1 - значащая часть числа, приведенная к интервалу 0. 1 - 1, a p - порядок числа n Аналогичная форма двоичного числа имеет вид X=m*2 в степени p, n где 0. 5 < m < 1 - мантисса, a p - двоичный порядок n Число с плавающей точкой можно представить в виде двух целых чисел со знаком (m и p), причем p - обычное целое со знаком, а m - представление дробной части, в которой десятичная точка считается расположенной после знакового разряда числа. Не вдаваясь в подробности выполнения операций с плавающей точкой, нужно заметить, что реализовать их можно как аппаратно, так и программно с использованием операций над обычными целыми со знаком n

n В Си имеется два типа данных для чисел с плавающей точкой: обычная (float) n В Си имеется два типа данных для чисел с плавающей точкой: обычная (float) и двойной точности (double). Перед использованием в выражении любая переменная типа float преобразуется к double n Для совместимости с программами написанными на языке Pascal добавлен еше один тип long double

n float n Переменной типа float компилятор отводит 4 байта памяти n Eе численное n float n Переменной типа float компилятор отводит 4 байта памяти n Eе численное значение хранится в нормализованном виде. Нормализация состоит в сдвиге значащих бит двоичного кода числа влево или вправо до тех пор, пока целая часть числа не станет равной единице. Разумеется, для сохранения численного значения каждая операция сдвига сопровождается соответствующим изменением двоичного порядка числа n Но если целая часть нормализованного двоичного числа всегда равна единице, ее можно вообще не хранить в ячейке памяти! Это экономит один "лишний" бит для записи мантиссы, увеличивая точность представления чисел. Конечно, при чтении числа из ячейки памяти такая "неявная единица", естественно, автоматически восстанавливается

n float n Порядок, полученный при нормализации, перед записью в ячейку памяти несколько видоизменяется. n float n Порядок, полученный при нормализации, перед записью в ячейку памяти несколько видоизменяется. К нему прибавляется фиксированное целое число так, чтобы он всегда был неотрицательным. Такой искусственно смещенный порядок называется характеристикой. Это избавляет от необходимости выделять специальный бит для хранения знака порядка и упрощает процедуру сравнения порядков чисел при выполнении над ними арифметических действий n Для чисел типа float прибавляется число 127, для чисел типа double прибавляется 1023, для чисел типа long double прибавляется 32773

n float n Структура ячейки памяти вещественной переменной типа float имеет вид: n 4 n float n Структура ячейки памяти вещественной переменной типа float имеет вид: n 4 байта <-----¦------------------------->¦ ¦ 1 бит¦ 8 бит ¦ 23 бита ¦ ¦знак ¦ Характеристика ¦ Мантисса ¦ ¦-----------¦--------------------¦

В качестве примера рассмотрим запись в такую ячейку числа 15. 375: 1111. 011 - В качестве примера рассмотрим запись в такую ячейку числа 15. 375: 1111. 011 - двоичный код числа Сдвигаем десятичную точку влево на три бита: n 1. 111011 * 2 в степени 3 - нормализованное число Получим из порядка характеристику: 3 + 127 = 130 или 1000 0010 в двоичной записи Учитывая, что число положительное, заполняем 4 байта памяти: ¦ 0¦ 100 0001 0¦ 111 0110 0000¦ 4 1 7 6 0 0 n n n Итак, если "заглянуть" в ячейку памяти, где хранится число 15. 375 , то мы "увидим" двоичный код 41760000 h. Минимальное значение |x| >= 1. 0 E-38 Максимальное значение |x| <= 1. 0 E+38

 <-----¦------------------------->¦ ¦ 1 бит¦ 8 бит ¦ 23 бита ¦ ¦знак ¦ Характеристика <-----¦------------------------->¦ ¦ 1 бит¦ 8 бит ¦ 23 бита ¦ ¦знак ¦ Характеристика ¦ Мантисса ¦ ¦-----------¦--------------------¦ n ¦ 0¦ 100 0001 0¦ 111 0110 0000¦ 4 1 7 6 0 0 ¦ 0¦ 1 000 001 0¦ 11 100 000 000 000¦ 0 0 0 n n n Итак, если "заглянуть" в ячейку памяти, где хранится число 15. 375 , то мы "увидим" двоичный код 41760000 h. Минимальное значение |x| >= 1. 0 E-38 Максимальное значение |x| <= 1. 0 E+38

n double n Структура ячейки памяти вещественной переменной типа double имеет вид: n 8 n double n Структура ячейки памяти вещественной переменной типа double имеет вид: n 8 байт <-----¦------------------------->¦ ¦ 1 бит¦ 11 бит ¦ 52 бита ¦ ¦знак ¦ Характеристика ¦ Мантисса ¦ ¦-----------¦--------------------¦ n Для вычисления характеристики прибавляется 1023. Увеличены как диапазон, так и точность представления вещественных чисел n Минимальное значение |x| >= 1. 0 E-308 Максимальное значение |x| <= 1. 0 E+308 n

n long double Структура ячейки памяти вещественной переменной типа long double имеет вид: n n long double Структура ячейки памяти вещественной переменной типа long double имеет вид: n n 10 байт <-----¦------------------------->¦ ¦ 1 бит¦ 16 бит ¦ 63 бита ¦ ¦знак ¦ Характеристика ¦ Мантисса ¦ ¦-----------¦--------------------¦ n Для вычисления характеристики прибавляется 32773. Увеличены как диапазон, так и точность представления вещественных чисел n Минимальное значение |x| >= 1. 0 E-4932 Максимальное значение |x| <= 1. 0 E+4932 n

15. 375 = |0|100 0000 0010 1|111 0110 0000 0000 0000 0000 4 0 15. 375 = |0|100 0000 0010 1|111 0110 0000 0000 0000 0000 4 0 0 2 15. 375 = n n n f 6 0 0 0 0 x 4002 f 60000000 h Арифметические операции над вещественными числами обычно выполняет специальный сопроцессор, который обычно встроен в основную схему процессора Если он отсутствует, его работа моделируется программным способом с помощью функций стандартной библиотеки (эмуляция сопроцессора). Это существенно снижает скорость работы программы Следующая программа позволяет посмотреть двоичное представление в памяти компьютера стандартных данных. Для завершения программы необходимо нажать Ctrl/C Пример программы

 Диапазон базовых типов сhar Символьная со знаком (1) от -128 до 127 int Диапазон базовых типов сhar Символьная со знаком (1) от -128 до 127 int Целая (2) от -32768 до 32767 short Короткая целая (2) от -32768 до 32767 long Длинная целая (4) от -2147483648 до 2147483647 unsigned char Символьная без знака (1) от 0 до 255 unsigned Целая без знака (2) от 0 до 65535 unsigned short Короткая целая без знака (2) от 0 до 65535 unsigned long Длинная целая без знака (4) от 0 до 4294967297 float Вещественная (4) |x| >= 1. 0 E-38 |x| <= 1. 0 E+38 double Вещественная двойной (8) |x| >= 1. 0 E-308 |x| <= 1. 0 E+308