Похожие презентации:
Система типов языка Си. Лекция 3
1.
Система типов языка СиЛекция 3
2.
План лекции• Что такое тип и система типов?
• Классификация типов языка Си
• Функциональные
• Полные
• Целые, с плавающей точкой, и т.п.
• Неполные
• void и другие
• Представление типов в памяти
2
3.
План лекцииhttps://fishki.net/3538965-vpihnuty-nevpihuemoe-25-primerov-zhadnosti-v-prirode.html
• Что такое тип и система типов?
• Классификация типов языка Си
• Функциональные
• Полные
• Целые, с плавающей точкой, и т.п.
• Неполные
• void и другие
• Представление типов в памяти
3
4.
Что такое тип и система типов?• Тип данных – это множество значений и набор операций над
ними
• Система типов языка программирования – это набор правил,
который назначает типы переменным, выражениям, функциям и
т.п. частям программы на этом языке
4
5.
Что такое тип и система типов?• Тип данных – это множество значений и набор операций над
ними
• Результат операции может принадлежать множеству значений другого
типа
• Например, результат сравнения чисел принадлежит множеству значений
булевского типа
• Система типов языка программирования – это набор правил,
который назначает типы переменным, выражениям, функциям и
т.п. частям программы на этом языке
5
6.
Что такое тип и система типов?• Тип данных – это множество значений и набор операций над
ними
• Результат операции может принадлежать множеству значений другого
типа
• Например, результат сравнения чисел принадлежит множеству значений
булевского типа
• Система типов языка программирования – это набор правил,
который назначает типы переменным, выражениям, функциям и
т.п. частям программы на этом языке
6
7.
Что такое тип и система типов?• Тип данных – это множество значений и набор операций над
ними
• Результат операции может принадлежать множеству значений другого
типа
• Например, результат сравнения чисел принадлежит множеству значений
булевского типа
• Система типов языка программирования – это набор правил,
который назначает типы переменным, выражениям, функциям и
т.п. частям программы на этом языке
7
8.
Классификация систем типов• Статические
• Все типы и ошибки типизации определяются во время компиляции программы
• Например, система типов языка Си и Паскаль
• Динамические
• Часть типов и/или ошибок типизации определяется только во время
исполнения программы
• Например, система типов языка С++
• Сильные
• Системы типов, которые исключают ошибки типизации
• Например, система типов языка Python
8
9.
Классификация систем типов• Статические
• Все типы и ошибки типизации определяются во время компиляции программы
• Например, система типов языка Си и Паскаль
• Динамические
• Часть типов и/или ошибок типизации определяется только во время
исполнения программы
• Например, система типов языка С++
• Сильные
• Системы типов, которые исключают ошибки типизации
• Например, система типов языка Python
9
10.
Классификация систем типов• Статические
• Все типы и ошибки типизации определяются во время компиляции программы
• Например, система типов языка Си и Паскаль
• Динамические
• Часть типов и/или ошибок типизации определяется только во время
исполнения программы
• Например, система типов языка С++
• Сильные
• Системы типов, которые исключают ошибки типизации
• Например, система типов языка Python
10
11.
Классификация систем типов• Статические
• Все типы и ошибки типизации определяются во время компиляции программы
• Например, система типов языка Си и Паскаль
• Динамические
• Часть типов и/или ошибок типизации определяется только во время
исполнения программы
• Например, система типов языка С++
• Сильные
• Системы типов, которые исключают ошибки типизации
• Например, система типов языка Python
11
12.
Классификация типов в языке Си12
13.
Классификация типов в языке СиПолные
С плавающей точкой
void
Неполные
Производные
Типы языка Си
Целые
Вещественные
Комплексные (C99)
Массивы
Структуры (struct)
Объединения (union)
Производные
Функциональные
Перечислимые (enum)
char
signed char, short, int, long, long long (C99)
Знаковые
unsigned + char/short/int/long/long long
Беззнаковые
Комплексные (C99) complex + [unsigned] char/short/int/long/long long
float, double, long double (C99)
complex + float/double/long double
Указатели
Массивы
Структуры (struct)
Объединения (union)
Перечислимые (enum)
13
14.
Типы языка СиКлассификация типов в языке Си
14
15.
Классификация типов в языке СиТипы языка Си
Функциональные
15
16.
Функциональные типы• Бесконечное семейство типов
• Множество значений
функционального типа – это
функции, имеющие
одинаковый прототип
• Операция – вызов
• В зависимости от вида
прототипа делятся на
• «Функция, возвращающая Т»
• T f();
• «Функция, возвращающая Т и
принимающая T1, T2, …, TN»
• T f(T1, T2, …, TN);
• «Вариадическая функция,
возвращающая Т и
принимающая T1, T2, …, TN»
• T f(T1, T2, …, TN, …);
16
17.
Функциональные типы• Бесконечное семейство типов
• Множество значений
функционального типа – это
функции, имеющие
одинаковый прототип
• Операция – вызов
• В зависимости от вида
прототипа делятся на
• «Функция, возвращающая Т»
• T f();
• «Функция, возвращающая Т и
принимающая T1, T2, …, TN»
• T f(T1, T2, …, TN);
• «Вариадическая функция,
возвращающая Т и
принимающая T1, T2, …, TN»
• T f(T1, T2, …, TN, …);
17
18.
Функциональные типы• Бесконечное семейство типов
• Множество значений
функционального типа – это
функции, имеющие
одинаковый прототип
• Операция – вызов
• В зависимости от вида
прототипа делятся на
• «Функция, возвращающая Т»
• T f();
• «Функция, возвращающая Т и
принимающая T1, T2, …, TN»
• T f(T1, T2, …, TN);
• «Вариадическая функция,
возвращающая Т и
принимающая T1, T2, …, TN»
• T f(T1, T2, …, TN, …);
18
19.
Функциональные типы• Бесконечное семейство типов
• Множество значений
функционального типа – это
функции, имеющие
одинаковый прототип
• Операция – вызов
• В зависимости от вида
прототипа делятся на
• «Функция, возвращающая Т»
• T f();
• «Функция, возвращающая Т и
принимающая T1, T2, …, TN»
• T f(T1, T2, …, TN);
• «Вариадическая функция,
возвращающая Т и
принимающая T1, T2, …, TN»
• T f(T1, T2, …, TN, …);
19
20.
Функциональные типы• Бесконечное семейство типов
• Множество значений
функционального типа – это
функции, имеющие
одинаковый прототип
• Операция – вызов
• В зависимости от вида
прототипа делятся на
• «Функция, возвращающая Т»
• T f();
• «Функция, возвращающая Т и
принимающая T1, T2, …, TN»
• T f(T1, T2, …, TN);
• «Вариадическая функция,
возвращающая Т и
принимающая T1, T2, …, TN»
• T f(T1, T2, …, TN, …);
20
21.
Классификация типов в языке СиТипы языка Си
Функциональные
Полные
21
22.
Полные типы• Бесконечное семейство типов
• Элементы множества значений имеют известный размер в байтах
22
23.
Полные типы• Бесконечное семейство типов
• Элементы множества значений имеют известный размер в байтах
23
24.
Полные типы• Бесконечное семейство типов
• Элементы множества значений имеют известный размер в байтах
24
25.
Классификация типов в языке СиТипы языка Си
Функциональные
Полные
Неполные
25
26.
Неполные типы• Бесконечное семейство типов
• Используются для конструирования производных типов
• см. слайды про указатели, массивы, структуры и объединения
26
27.
Неполные типы• Бесконечное семейство типов
• Используются для конструирования производных типов
• см. слайды про указатели, массивы, структуры и объединения
27
28.
Неполные типы• Бесконечное семейство типов
• Используются для конструирования производных типов
• см. слайды про указатели, массивы, структуры и объединения
28
29.
Классификация типов в языке СиФункциональные
Типы языка Си
Целые
Полные
Неполные
29
30.
Целые типы• Бесконечное семейство типов
• «Бесконечное» – это не опечатка
• Множество значений состоит из обычных или комплексных целых
чисел (C99)
• Операции
• Для всех целых типов – арифметика и проверка равенства
• Дополнительно для обычных целых – побитовые и проверка порядка
• Результат арифметических операций над некоторыми значениями может быть
не определён или implementation defined
• Результат сравнения всегда определён
30
31.
Целые типы• Бесконечное семейство типов
• «Бесконечное» – это не опечатка
• Множество значений состоит из обычных или комплексных целых
чисел (C99)
• Операции
• Для всех целых типов – арифметика и проверка равенства
• Дополнительно для обычных целых – побитовые и проверка порядка
• Результат арифметических операций над некоторыми значениями может быть
не определён или implementation defined
• Результат сравнения всегда определён
31
32.
Целые типы• Бесконечное семейство типов
• «Бесконечное» – это не опечатка
• Множество значений состоит из обычных или комплексных целых
чисел (C99)
• Операции
• Для всех целых типов – арифметика и проверка равенства
• Дополнительно для обычных целых – побитовые и проверка порядка
• Результат арифметических операций над некоторыми значениями может быть
не определён или implementation defined
• Результат сравнения всегда определён
32
33.
Целые типы• Бесконечное семейство типов
• «Бесконечное» – это не опечатка
• Множество значений состоит из обычных или комплексных целых
чисел (C99)
• Операции
• Для всех целых типов – арифметика и проверка равенства
• Дополнительно для обычных целых – побитовые и проверка порядка
• Результат арифметических операций над некоторыми значениями может быть
не определён или implementation defined
• Результат сравнения всегда определён
33
34.
Целые типы• Бесконечное семейство типов
• «Бесконечное» – это не опечатка
• Множество значений состоит из обычных или комплексных целых
чисел (C99)
• Операции
• Для всех целых типов – арифметика и проверка равенства
• Дополнительно для обычных целых – побитовые и проверка порядка
• Результат арифметических операций над некоторыми значениями может быть
не определён или implementation defined
• Результат сравнения всегда определён
34
35.
Классификация типов в языке СиФункциональные
Типы языка Си
Целые
Полные
С плавающей точкой
Неполные
35
36.
Типы с «плавающей точкой»• Конечное семейство типов
• Множество значений содержит обычные или комплексные нецелые
числа (C99)
• Как правило, целые числа тоже содержит
• Операции
• Арифметика, проверка равенства
• Для обычных чисел с плавающей точкой – проверка порядка
• Результат арифметических операций всегда определен, но может отличаться от
результата соотв. арифметической операции в математике
• Результат сравнения всегда определён
36
37.
Типы с «плавающей точкой»• Конечное семейство типов
• Множество значений содержит обычные или комплексные нецелые
числа (C99)
• Как правило, целые числа тоже содержит
• Операции
• Арифметика, проверка равенства
• Для обычных чисел с плавающей точкой – проверка порядка
• Результат арифметических операций всегда определен, но может отличаться от
результата соотв. арифметической операции в математике
• Результат сравнения всегда определён
37
38.
Типы с «плавающей точкой»• Конечное семейство типов
• Множество значений содержит обычные или комплексные нецелые
числа (C99)
• Как правило, целые числа тоже содержит
• Операции
• Арифметика, проверка равенства
• Для обычных чисел с плавающей точкой – проверка порядка
• Результат арифметических операций всегда определен, но может отличаться от
результата соотв. арифметической операции в математике
• Результат сравнения всегда определён
38
39.
Типы с «плавающей точкой»• Конечное семейство типов
• Множество значений содержит обычные или комплексные нецелые
числа (C99)
• Как правило, целые числа тоже содержит
• Операции
• Арифметика, проверка равенства
• Для обычных чисел с плавающей точкой – проверка порядка
• Результат арифметических операций всегда определен, но может отличаться от
результата соотв. арифметической операции в математике
• Результат сравнения всегда определён
39
40.
Типы с «плавающей точкой»• Конечное семейство типов
• Множество значений содержит обычные или комплексные нецелые
числа (C99)
• Как правило, целые числа тоже содержит
• Операции
• Арифметика, проверка равенства
• Для обычных чисел с плавающей точкой – проверка порядка
• Результат арифметических операций всегда определен, но может отличаться от
результата соотв. арифметической операции в математике
• Результат сравнения всегда определён
40
41.
Классификация типов в языке СиФункциональные
Полные
Неполные
С плавающей точкой
Производные
Типы языка Си
Целые
41
42.
Производные типы• Бесконечное семейство типов
• Множество значений и набор операций выражаются через
множества значений и наборы операций других типов
42
43.
Производные типы• Бесконечное семейство типов
• Множество значений и набор операций выражаются через
множества значений и наборы операций других типов
43
44.
Производные типы• Бесконечное семейство типов
• Множество значений и набор операций выражаются через
множества значений и наборы операций других типов
44
45.
Классификация типов в языке СиПеречислимые (enum)
Функциональные
Полные
Неполные
С плавающей точкой
Производные
Типы языка Си
Целые
45
46.
Перечислимые типы• Бесконечное семейство типов
• Множество значений перечислимого типа – это значения
именованных констант, описанных внутри {} после
соответствующего enum
• Операции см. на слайде про целые типы
46
47.
Перечислимые типы• Бесконечное семейство типов
• Множество значений перечислимого типа – это значения
именованных констант, описанных внутри {} после
соответствующего enum
• Операции см. на слайде про целые типы
47
48.
Перечислимые типы• Бесконечное семейство типов
• Множество значений перечислимого типа – это значения
именованных констант, описанных внутри {} после
соответствующего enum
• Операции см. на слайде про целые типы
48
49.
Перечислимые типы• Бесконечное семейство типов
• Множество значений перечислимого типа – это значения
именованных констант, описанных внутри {} после
соответствующего enum
• Операции см. на слайде про целые типы
49
50.
Классификация типов в языке СиПеречислимые (enum)
char
Функциональные
Полные
Неполные
С плавающей точкой
Производные
Типы языка Си
Целые
50
51.
Тип char• Множество значений является интервалом и содержит не менее
128 неотрицательных элементов
• неотрицательные элементы взаимно-однозначно соответствуют
символам ASCII
• наличие отрицательных значений является implementation defined
• обычно множество значений char содержит 256 элементов
• Набор операций см. на слайде про целые типы
51
52.
Тип char• Множество значений является интервалом и содержит не менее
128 неотрицательных элементов
• неотрицательные элементы взаимно-однозначно соответствуют
символам ASCII
• наличие отрицательных значений является implementation defined
• обычно множество значений char содержит 256 элементов
• Набор операций см. на слайде про целые типы
52
53.
Тип char• Множество значений является интервалом и содержит не менее
128 неотрицательных элементов
• неотрицательные элементы взаимно-однозначно соответствуют
символам ASCII
• наличие отрицательных значений является implementation defined
• обычно множество значений char содержит 256 элементов
• Набор операций см. на слайде про целые типы
53
54.
Тип char• Множество значений является интервалом и содержит не менее
128 неотрицательных элементов
• неотрицательные элементы взаимно-однозначно соответствуют
символам ASCII
• наличие отрицательных значений является implementation defined
• обычно множество значений char содержит 256 элементов
• Набор операций см. на слайде про целые типы
54
55.
Классификация типов в языке СиФункциональные
Полные
Неполные
Производные
Типы языка Си
Целые
Перечислимые (enum)
char
signed char, short, int, long, long long (C99)
Знаковые
55
56.
Знаковые типы• Конечное семейство типов
• Множество значений знакового типа является интервалом целых
чисел и содержит отрицательные и неотрицательные значения
• signed char short int long long long
• sizeof(char) == sizeof(signed char)
• Набор операций см. на слайде про целые типы
56
57.
Знаковые типы• Конечное семейство типов
• Множество значений знакового типа является интервалом целых
чисел и содержит отрицательные и неотрицательные значения
• signed char short int long long long
• sizeof(char) == sizeof(signed char)
• Набор операций см. на слайде про целые типы
57
58.
Знаковые типы• Конечное семейство типов
• Множество значений знакового типа является интервалом целых
чисел и содержит отрицательные, положительные значения и
ноль signed char short int long long long
• sizeof(char) == sizeof(signed char)
• Набор операций см. на слайде про целые типы
58
59.
Знаковые типы• Конечное семейство типов
• Множество значений знакового типа является интервалом целых
чисел и содержит отрицательные, положительные значения и
ноль
• 0 signed char short int long long long
• sizeof(char) == sizeof(signed char)
• Набор операций см. на слайде про целые типы
59
60.
Знаковые типы• Конечное семейство типов
• Множество значений знакового типа является интервалом целых
чисел и содержит отрицательные, положительные значения и
ноль
• 0 signed char short int long long long
• sizeof(char) == sizeof(signed char)
• Набор операций см. на слайде про целые типы
60
61.
Классификация типов в языке СиФункциональные
Полные
Неполные
С плавающей точкой
Производные
Типы языка Си
Целые
Перечислимые (enum)
char
signed char, short, int, long, long long (C99)
Знаковые
unsigned + char/short/int/long/long long
Беззнаковые
61
62.
Беззнаковые типы• Конечное семейство типов
• Множество значений беззнакового типа является интервалом
неотрицательных целых чисел и содержит ноль
• 0 unsigned char unsigned short unsigned int unsigned long
unsigned long long
• Набор операций см. на слайде про целые типы
• Арифметические операции выполняются по модулю (1 + максимальное
значение в множестве значений)
• Результат всегда определён
62
63.
Беззнаковые типы• Конечное семейство типов
• Множество значений беззнакового типа является интервалом
неотрицательных целых чисел и содержит ноль
• 0 unsigned char unsigned short unsigned int unsigned long
unsigned long long
• Набор операций см. на слайде про целые типы
• Арифметические операции выполняются по модулю (1 + максимальное
значение в множестве значений)
• Результат всегда определён
63
64.
Беззнаковые типы• Конечное семейство типов
• Множество значений беззнакового типа является интервалом
неотрицательных целых чисел и содержит ноль
• 0 unsigned char unsigned short unsigned int unsigned long
unsigned long long
• Набор операций см. на слайде про целые типы
• Арифметические операции выполняются по модулю (1 + максимальное
значение в множестве значений)
• Результат всегда определён
64
65.
Беззнаковые типы• Конечное семейство типов
• Множество значений беззнакового типа является интервалом
неотрицательных целых чисел и содержит ноль
• 0 unsigned char unsigned short unsigned int unsigned long
unsigned long long
• Набор операций см. на слайде про целые типы
• Арифметические операции выполняются по модулю (1 + максимальное
значение в множестве значений)
• Результат всегда определён
65
66.
Беззнаковые типы• Конечное семейство типов
• Множество значений беззнакового типа является интервалом
неотрицательных целых чисел и содержит ноль
• 0 unsigned char unsigned short unsigned int unsigned long
unsigned long long
• Набор операций см. на слайде про целые типы
• Арифметические операции над значениями беззнакового типа UT
выполняются по модулю 28∙sizeof(UT)
• Результат всегда определён
66
67.
Связь знаковых и беззнаковых типов• Если T – знаковый целый тип, UT – соответствующий беззнаковый
целый тип, то
• sizeof(T) == sizeof(UT)
• Диапазон неотрицательных значений T диапазон значений UT
• В зависимости от компилятора (implementation defined) диапазон
значений char совпадает
• с диапазоном значений signed char или
• с диапазоном значений unsigned char
67
68.
Связь знаковых и беззнаковых типов• Если T – знаковый целый тип, UT – соответствующий беззнаковый
целый тип, то
• sizeof(T) == sizeof(UT)
• Диапазон неотрицательных значений T диапазон значений UT
• В зависимости от компилятора (implementation defined) диапазон
значений char совпадает
• с диапазоном значений signed char или
• с диапазоном значений unsigned char
68
69.
Связь знаковых и беззнаковых типов• Если T – знаковый целый тип, UT – соответствующий беззнаковый
целый тип, то
• sizeof(T) == sizeof(UT)
• Диапазон неотрицательных значений T диапазон значений UT
• В зависимости от компилятора (implementation defined) диапазон
значений char совпадает
• с диапазоном значений signed char или
• с диапазоном значений unsigned char
69
70.
Связь знаковых и беззнаковых типов• Если T – знаковый целый тип, UT – соответствующий беззнаковый
целый тип, то
• sizeof(T) == sizeof(UT)
• Диапазон неотрицательных значений T диапазон значений UT
• В зависимости от компилятора (implementation defined) диапазон
значений char совпадает
• с диапазоном значений signed char или
• с диапазоном значений unsigned char
70
71.
Связь знаковых и беззнаковых типов• Если T – знаковый целый тип, UT – соответствующий беззнаковый
целый тип, то
• sizeof(T) == sizeof(UT)
• Диапазон неотрицательных значений T диапазон значений UT
• В зависимости от компилятора (implementation defined) диапазон
значений char совпадает
• с диапазоном значений signed char или
• с диапазоном значений unsigned char
71
72.
Классификация типов в языке СиФункциональные
Полные
Неполные
С плавающей точкой
Производные
Типы языка Си
Целые
Перечислимые (enum)
char
signed char, short, int, long, long long (C99)
Знаковые
unsigned + char/short/int/long/long long
Беззнаковые
Комплексные (C99) complex + [unsigned] char/short/int/long/long long
72
73.
Комплексные целые типы• Конечное семейство типов в C99
• Множество значений комплексного целого типа является
подмножеством комплексных чисел с целыми вещественной и
мнимой частью
• Набор операций см. на слайде про целые типы
73
74.
Комплексные целые типы• Конечное семейство типов в C99
• Множество значений комплексного целого типа является
подмножеством комплексных чисел с целыми вещественной и
мнимой частью
• Набор операций см. на слайде про целые типы
• Редко встречаются на практике
74
75.
Классификация типов в языке СиТипы языка Си
Целые
Полные
Неполные
С плавающей точкой
Вещественные
float, double, long double (C99)
Производные
Функциональные
Перечислимые (enum)
char
signed char, short, int, long, long long (C99)
Знаковые
unsigned + char/short/int/long/long long
Беззнаковые
Комплексные (C99) complex + [unsigned] char/short/int/long/long long
75
76.
Вещественные типы• Конечное семейство типов
• Множество значений вещественного типа является интервалом
вещественных чисел и содержит ноль
• 0 float double long double
• Набор операций см. на слайде про типы с плавающей точкой
76
77.
Вещественные типы• Конечное семейство типов
• Множество значений вещественного типа является интервалом
вещественных чисел и содержит ноль
• 0 float double long double
• Набор операций см. на слайде про типы с плавающей точкой
77
78.
Вещественные типы• Конечное семейство типов
• Множество значений вещественного типа является интервалом
вещественных чисел и содержит ноль
• 0 float double long double
• Набор операций см. на слайде про типы с плавающей точкой
78
79.
Вещественные типы• Конечное семейство типов
• Множество значений вещественного типа является интервалом
вещественных чисел и содержит ноль
• 0 float double long double
• Набор операций см. на слайде про типы с плавающей точкой
79
80.
Вещественные типы• Конечное семейство типов
• Множество значений вещественного типа является интервалом
вещественных чисел и содержит ноль
• 0 float double long double
• Набор операций см. на слайде про типы с плавающей точкой
80
81.
Классификация типов в языке СиТипы языка Си
Целые
Полные
Неполные
С плавающей точкой
float, double, long double (C99)
Вещественные
Комплексные (C99) complex + float/double/long double
Производные
Функциональные
Перечислимые (enum)
char
signed char, short, int, long, long long (C99)
Знаковые
unsigned + char/short/int/long/long long
Беззнаковые
Комплексные (C99) complex + [unsigned] char/short/int/long/long long
81
82.
Комплексные типы• Конечное семейство типов в C99
• Множество значений комплексного типа является
подмножеством комплексных чисел, содержащим ноль
• 0 complex float complex double complex long double
• Набор операций см. на слайде про целые типы
82
83.
Комплексные типы• Конечное семейство типов в C99
• Множество значений комплексного типа является
подмножеством комплексных чисел, содержащим ноль
• 0 complex float complex double complex long double
• Набор операций см. на слайде про целые типы
83
84.
Комплексные типы• Конечное семейство типов в C99
• Множество значений комплексного типа является
подмножеством комплексных чисел, содержащим ноль
• 0 complex float complex double complex long double
• Набор операций см. на слайде про целые типы
84
85.
Комплексные типы• Конечное семейство типов в C99
• Множество значений комплексного типа является
подмножеством комплексных чисел, содержащим ноль
• 0 complex float complex double complex long double
• Набор операций см. на слайде про целые типы
85
86.
Комплексные типы• Конечное семейство типов в C99
• Множество значений комплексного типа является
подмножеством комплексных чисел, содержащим ноль
• 0 complex float complex double complex long double
• Набор операций см. на слайде про типы с плавающей точкой
86
87.
Классификация типов в языке СиТипы языка Си
Целые
Полные
Неполные
С плавающей точкой
Вещественные
Комплексные (C99)
Производные
Функциональные
Перечислимые (enum)
char
signed char, short, int, long, long long (C99)
Знаковые
unsigned + char/short/int/long/long long
Беззнаковые
Комплексные (C99) complex + [unsigned] char/short/int/long/long long
float, double, long double (C99)
complex + float/double/long double
Указатели
87
88.
Указатели• Бесконечное семейство типов T*
• Тип T может быть неполным
• Множество значений типа «указатель на тип T» совпадает с множеством адресов памяти и
содержит нулевой адрес NULL
• Одно и то же множество значений у всех типов этого семейства
• Операции
• Арифметика указателей
• смещение на целое число значений типа T (T*, целое) -> T*
• расстояние между указателями типа T (T*, T*) -> целое
Разыменование T* -> T
Взятие адреса T -> T*
Доступ по индексу – смещение + разыменование
Проверка равенства, проверка порядка (T*, T*) -> булевское
88
89.
Указатели• Бесконечное семейство типов T*
• Тип T может быть неполным
• Множество значений типа «указатель на тип T» совпадает с множеством адресов памяти и
содержит нулевой адрес NULL
• Одно и то же множество значений у всех типов этого семейства
• Операции
• Арифметика указателей
• смещение на целое число значений типа T (T*, целое) -> T*
• расстояние между указателями типа T (T*, T*) -> целое
Разыменование T* -> T
Взятие адреса T -> T*
Доступ по индексу – смещение + разыменование
Проверка равенства, проверка порядка (T*, T*) -> булевское
89
90.
Указатели• Бесконечное семейство типов T*
• Тип T может быть неполным
• Множество значений типа «указатель на тип T» совпадает с множеством адресов памяти и
содержит нулевой адрес NULL
• Одно и то же множество значений у всех типов этого семейства
• Операции
• Арифметика указателей
• смещение на целое число значений типа T (T*, целое) -> T*
• расстояние между указателями типа T (T*, T*) -> целое
Разыменование T* -> T
Взятие адреса T -> T*
Доступ по индексу – смещение + разыменование
Проверка равенства, проверка порядка (T*, T*) -> булевское
90
91.
Указатели• Бесконечное семейство типов T*
• Тип T может быть неполным
• Множество значений типа «указатель на тип T» совпадает с множеством адресов памяти и
содержит нулевой адрес NULL
• Одно и то же множество значений у всех типов этого семейства
• Операции
• Арифметика указателей
• смещение на целое число значений типа T (T*, целое) -> T*
• расстояние между указателями типа T (T*, T*) -> целое
Разыменование T* -> T
Взятие адреса T -> T*
Доступ по индексу (T*, целое) -> T – смещение + разыменование
Проверка равенства, проверка порядка (T*, T*) -> булевское
91
92.
Классификация типов в языке СиТипы языка Си
Целые
Полные
Неполные
С плавающей точкой
Вещественные
Комплексные (C99)
Производные
Функциональные
Перечислимые (enum)
char
signed char, short, int, long, long long (C99)
Знаковые
unsigned + char/short/int/long/long long
Беззнаковые
Комплексные (C99) complex + [unsigned] char/short/int/long/long long
float, double, long double (C99)
complex + float/double/long double
Указатели
Массивы
92
93.
Массивы• Бесконечное семейство типов T[N]
• Тип T полный, целое N > 0
• Множество значений типа «массив из N элементов типа T» -- это
множество последовательностей длины N, состоящих из значений
типа T
• Декартова степень множества значений типа T -- TN
• Операции
• Автоматическое преобразование в указатель на нулевой элемент T[N] -> T*
• После преобразования в указатель – все операции над указателями
• В том числе, доступ по индексу
93
94.
Массивы• Бесконечное семейство типов T[N]
• Тип T полный, целое N > 0
• Множество значений типа «массив из N элементов типа T» -- это
множество последовательностей длины N, состоящих из значений
типа T
• Декартова степень множества значений типа T -- TN
• Операции
• Автоматическое преобразование в указатель на нулевой элемент T[N] -> T*
• После преобразования в указатель – все операции над указателями
• В том числе, доступ по индексу
94
95.
Массивы• Бесконечное семейство типов T[N]
• Тип T полный, целое N > 0
• Множество значений типа «массив из N элементов типа T» -- это
множество последовательностей длины N, состоящих из значений
типа T
• Декартова степень множества значений типа T -- TN
• Операции
• Автоматическое преобразование в указатель на нулевой элемент T[N] -> T*
• После преобразования в указатель – все операции над указателями
• В том числе, доступ по индексу
95
96.
Массивы• Бесконечное семейство типов T[N]
• Тип T полный, целое N > 0
• Множество значений типа «массив из N элементов типа T» -- это
множество последовательностей длины N, состоящих из значений
типа T
• Декартова степень множества значений типа T -- TN
• Операции
• Автоматическое преобразование в указатель на нулевой элемент T[N] -> T*
• После преобразования в указатель – все операции над указателями
• В том числе, доступ по индексу
96
97.
Классификация типов в языке СиТипы языка Си
Целые
Полные
Неполные
С плавающей точкой
Вещественные
Комплексные (C99)
Производные
Функциональные
Перечислимые (enum)
char
signed char, short, int, long, long long (C99)
Знаковые
unsigned + char/short/int/long/long long
Беззнаковые
Комплексные (C99) complex + [unsigned] char/short/int/long/long long
float, double, long double (C99)
complex + float/double/long double
Указатели
Массивы
Структуры (struct)
97
98.
Структуры struct• Бесконечное семейство типов struct S {T1 E1; T2 E2; … TN EN;}
• T1, T2, …, TN могут быть разными
• T1, T2, …, TN-1 должны быть полными
• TN может быть неполным типом-массивом
• Например, struct TCharBuffer { int Size; char Data[]; };
• Множество значений типа «структура из элементов типов T1, T2, …, TN» -- это
множество последовательностей длины N, состоящих из значений типов T1,
T2, …, TN
• Декартово произведение множеств значений T1 × T2 × … × TN
• Операции
• Доступ к элементу структуры по имени Ei struct S -> Ti
• Доступ к элементу структуры по имени Ei по указателю struct S* -> Ti
98
99.
Структуры struct• Бесконечное семейство типов struct S {T1 E1; T2 E2; … TN EN;}
• T1, T2, …, TN могут быть разными
• T1, T2, …, TN-1 должны быть полными
• TN может быть неполным типом-массивом
• Например, struct TCharBuffer { int Size; char Data[]; };
• Множество значений типа «структура из элементов типов T1, T2, …, TN» -- это
множество последовательностей длины N, состоящих из значений типов T1,
T2, …, TN
• Декартово произведение множеств значений T1 × T2 × … × TN
• Операции
• Доступ к элементу структуры по имени Ei struct S -> Ti
• Доступ к элементу структуры по имени Ei по указателю struct S* -> Ti
99
100.
Структуры struct• Бесконечное семейство типов struct S {T1 E1; T2 E2; … TN EN;}
• T1, T2, …, TN могут быть разными
• T1, T2, …, TN-1 должны быть полными
• TN может быть неполным типом-массивом
• Например, struct TCharBuffer { int Size; char Data[]; };
• Множество значений типа «структура из элементов типов T1, T2, …, TN» -- это
множество последовательностей длины N таких, что i-й элемент каждой
последовательности принадлежит Ti (i=1, …, N)
• Декартово произведение множеств значений T1 × T2 × … × TN
• Операции
• Доступ к элементу структуры по имени Ei struct S -> Ti
• Доступ к элементу структуры по имени Ei по указателю struct S* -> Ti
100
101.
Структуры struct• Бесконечное семейство типов struct S {T1 E1; T2 E2; … TN EN;}
• T1, T2, …, TN могут быть разными
• T1, T2, …, TN-1 должны быть полными
• TN может быть неполным типом-массивом
• Например, struct TCharBuffer { int Size; char Data[]; };
• Множество значений типа «структура из элементов типов T1, T2, …, TN» -- это
множество последовательностей длины N таких, что i-й элемент каждой
последовательности принадлежит Ti (i=1, …, N)
• Декартово произведение множеств значений T1 × T2 × … × TN
• Операции
• Доступ к элементу структуры по имени Ei struct S -> Ti
• Доступ к элементу структуры по имени Ei по указателю struct S* -> Ti
101
102.
Классификация типов в языке СиТипы языка Си
Целые
Полные
Неполные
С плавающей точкой
Вещественные
Комплексные (C99)
Производные
Функциональные
Перечислимые (enum)
char
signed char, short, int, long, long long (C99)
Знаковые
unsigned + char/short/int/long/long long
Беззнаковые
Комплексные (C99) complex + [unsigned] char/short/int/long/long long
float, double, long double (C99)
complex + float/double/long double
Указатели
Массивы
Структуры (struct)
Объединения (union)
102
103.
Объединения union• Бесконечное семейство типов union U {T1 E1; T2 E2; … TN EN;}
• T1, T2, …, TN могут быть разными и должны быть полными
• Множество значений типа «объединение из элементов типов T1, T2, …,
TN» – это объединение множеств значений типов T1, T2, …, TN
• Операции
• Доступ к элементу объединения по имени Ei union U -> Ti
• Доступ к элементу объединения по имени Ei по указателю union U* -> Ti
• Результат чтения элемента по имени Ei не определен, если ему не предшествует
запись элемента по этому имени
103
104.
Объединения union• Бесконечное семейство типов union U {T1 E1; T2 E2; … TN EN;}
• T1, T2, …, TN могут быть разными и должны быть полными
• Множество значений типа «объединение из элементов типов T1, T2, …,
TN» – это объединение множеств значений типов T1, T2, …, TN
• Операции
• Доступ к элементу объединения по имени Ei union U -> Ti
• Доступ к элементу объединения по имени Ei по указателю union U* -> Ti
• Результат чтения элемента по имени Ei не определен, если ему не предшествует
запись элемента по этому имени
104
105.
Объединения union• Бесконечное семейство типов union U {T1 E1; T2 E2; … TN EN;}
• T1, T2, …, TN могут быть разными и должны быть полными
• Множество значений типа «объединение из элементов типов T1, T2, …,
TN» – это объединение множеств значений типов T1, T2, …, TN
• Операции
• Доступ к элементу объединения по имени Ei union U -> Ti
• Доступ к элементу объединения по имени Ei по указателю union U* -> Ti
• Результат чтения элемента по имени Ei не определен, если ему не предшествует
запись элемента по этому имени
105
106.
Объединения union• Бесконечное семейство типов union U {T1 E1; T2 E2; … TN EN;}
• T1, T2, …, TN могут быть разными и должны быть полными
• Множество значений типа «объединение из элементов типов T1, T2, …,
TN» – это объединение множеств значений типов T1, T2, …, TN
• Операции
• Доступ к элементу объединения по имени Ei union U -> Ti
• Доступ к элементу объединения по имени Ei по указателю union U* -> Ti
• Результат чтения элемента по имени Ei не определен, если ему не предшествует
запись элемента по этому имени
106
107.
Классификация типов в языке СиТипы языка Си
Целые
Полные
С плавающей точкой
void
Неполные
Вещественные
Комплексные (C99)
Производные
Функциональные
Перечислимые (enum)
char
signed char, short, int, long, long long (C99)
Знаковые
unsigned + char/short/int/long/long long
Беззнаковые
Комплексные (C99) complex + [unsigned] char/short/int/long/long long
float, double, long double (C99)
complex + float/double/long double
Указатели
Массивы
Структуры (struct)
Объединения (union)
107
108.
Тип void• Множество значений пусто
• Набор операций пуст
108
109.
Классификация типов в языке СиТипы языка Си
Целые
Полные
С плавающей точкой
void
Неполные
Вещественные
Комплексные (C99)
Производные
Функциональные
Перечислимые (enum)
char
signed char, short, int, long, long long (C99)
Знаковые
unsigned + char/short/int/long/long long
Беззнаковые
Комплексные (C99) complex + [unsigned] char/short/int/long/long long
float, double, long double (C99)
complex + float/double/long double
Указатели
Массивы
Структуры (struct)
Объединения (union)
Перечислимые (enum)
109
110.
Неполные перечисления• Бесконечное семейство типов enum E
• Перечисления с неизвестным списком именованных констант
• Перечисление enum E становится полным после того, как компилятор
встретит enum E { … } с тем же тэгом E и списком именованных констант
• Множество значений пусто
• Набор операций пуст
110
111.
Неполные перечисления• Бесконечное семейство типов enum E
• Перечисления с неизвестным списком именованных констант
• Перечисление enum E становится полным после того, как компилятор
встретит enum E { … } с тем же тэгом E и списком именованных констант
• Множество значений пусто
• Набор операций пуст
111
112.
Неполные перечисления• Бесконечное семейство типов enum E
• Перечисления с неизвестным списком именованных констант
• Перечисление enum E становится полным после того, как компилятор
встретит enum E { … } с тем же тэгом E и списком именованных констант
• Множество значений пусто
• Набор операций пуст
112
113.
Классификация типов в языке СиПолные
С плавающей точкой
void
Неполные
Производные
Типы языка Си
Целые
Массивы
Вещественные
Комплексные (C99)
Производные
Функциональные
Перечислимые (enum)
char
signed char, short, int, long, long long (C99)
Знаковые
unsigned + char/short/int/long/long long
Беззнаковые
Комплексные (C99) complex + [unsigned] char/short/int/long/long long
float, double, long double (C99)
complex + float/double/long double
Указатели
Массивы
Структуры (struct)
Объединения (union)
Перечислимые (enum)
113
114.
Неполные массивы• Бесконечное семейство типов T[]
• Тип T должен быть полным
• Множество значений типа «неполный массив типа T» – все
непустые конечные последовательности значений типа T
• i ≥ 1 Ti
• Операции
• Автоматическое преобразование в указатель на нулевой элемент T[] -> T*
• После преобразования в указатель – все операции с указателями
• В том числе, доступ по индексу
114
115.
Неполные массивы• Бесконечное семейство типов T[]
• Тип T должен быть полным
• Множество значений типа «неполный массив типа T» – все
непустые конечные последовательности значений типа T
• i ≥ 1 Ti
• Операции
• Автоматическое преобразование в указатель на нулевой элемент T[] -> T*
• После преобразования в указатель – все операции с указателями
• В том числе, доступ по индексу
115
116.
Неполные массивы• Бесконечное семейство типов T[]
• Тип T должен быть полным
• Множество значений типа «неполный массив типа T» – все
непустые конечные последовательности значений типа T
• i ≥ 1 Ti
• Операции
• Автоматическое преобразование в указатель на нулевой элемент T[] -> T*
• После преобразования в указатель – все операции с указателями
• В том числе, доступ по индексу
116
117.
Неполные массивы• Бесконечное семейство типов T[]
• Тип T должен быть полным
• Множество значений типа «неполный массив типа T» – все
непустые конечные последовательности значений типа T
• i ≥ 1 Ti
• Операции
• Автоматическое преобразование в указатель на нулевой элемент T[] -> T*
• После преобразования в указатель – все операции с указателями
• В том числе, доступ по индексу
117
118.
Классификация типов в языке СиПолные
С плавающей точкой
void
Неполные
Производные
Типы языка Си
Целые
Вещественные
Комплексные (C99)
Массивы
Структуры (struct)
Объединения (union)
Производные
Функциональные
Перечислимые (enum)
char
signed char, short, int, long, long long (C99)
Знаковые
unsigned + char/short/int/long/long long
Беззнаковые
Комплексные (C99) complex + [unsigned] char/short/int/long/long long
float, double, long double (C99)
complex + float/double/long double
Указатели
Массивы
Структуры (struct)
Объединения (union)
Перечислимые (enum)
118
119.
Неполные структуры (объединения)• Бесконечное семейство типов struct S (union U)
• Структуры (объединения) с неизвестным или незавершенным списком элементов
• полностью отсутствует список элементов { … }
• компилятор не встретил закрывающуюся } списка элементов
• Внутри своего описания структура является неполным типом
• Структура struct S (union U) становится полной после того, как компилятор встретит
• struct S { … } (union U { … }) с тем же тэгом и списком элементов или
• закрывающуюся } списка элементов
• Множество значений пусто
• Набор операций пуст
119
120.
Неполные структуры (объединения)• Бесконечное семейство типов struct S (union U)
• Структуры (объединения) с неизвестным или незавершенным списком элементов
• полностью отсутствует список элементов { … }
• компилятор не встретил закрывающуюся } списка элементов
• Внутри своего описания структура является неполным типом
• Структура struct S (union U) становится полной после того, как компилятор встретит
• struct S { … } (union U { … }) с тем же тэгом и списком элементов или
• закрывающуюся } списка элементов
• Множество значений пусто
• Набор операций пуст
120
121.
Неполные структуры (объединения)• Бесконечное семейство типов struct S (union U)
• Структуры (объединения) с неизвестным или незавершенным списком элементов
• полностью отсутствует список элементов { … }
• компилятор не встретил закрывающуюся } списка элементов
• Внутри своего описания структура является неполным типом
• Структура struct S (union U) становится полной после того, как компилятор встретит
• struct S { … } (union U { … }) с тем же тэгом и списком элементов или
• закрывающуюся } списка элементов
• Множество значений пусто
• Набор операций пуст
121
122.
Неполные структуры (объединения)• Бесконечное семейство типов struct S (union U)
• Структуры (объединения) с неизвестным или незавершенным списком элементов
• полностью отсутствует список элементов { … }
• компилятор не встретил закрывающуюся } списка элементов
• Внутри своего описания структура является неполным типом
• Структура struct S (union U) становится полной после того, как компилятор встретит
• struct S { … } (union U { … }) с тем же тэгом и списком элементов или
• закрывающуюся } списка элементов
• Множество значений пусто
• Набор операций пуст
122
123.
Классификация типов в языке СиПолные
С плавающей точкой
void
Неполные
Производные
Типы языка Си
Целые
Вещественные
Комплексные (C99)
Массивы
Структуры (struct)
Объединения (union)
Производные
Функциональные
Перечислимые (enum)
char
signed char, short, int, long, long long (C99)
Знаковые
unsigned + char/short/int/long/long long
Беззнаковые
Комплексные (C99) complex + [unsigned] char/short/int/long/long long
float, double, long double (C99)
complex + float/double/long double
Указатели
Массивы
Структуры (struct)
Объединения (union)
Перечислимые (enum)
123
124.
Что хранится в памяти?• Значение – это непрерывная последовательность байтов памяти
• Размер значения – это длина это последовательности байтов
• Битовое поле – это непрерывная последовательность битов
памяти
• Размер битового поля – это длина это последовательности битов
• Хранятся внутри значений целых типов
• Используются довольно редко
124
125.
Что хранится в памяти?• Значение – это непрерывная последовательность байтов памяти
• Размер значения – это длина это последовательности байтов
• Битовое поле – это непрерывная последовательность битов
памяти
• Размер битового поля – это длина это последовательности битов
• Хранятся внутри значений целых типов
• Используются довольно редко
125
126.
Что хранится в памяти?• Значение – это непрерывная последовательность байтов памяти
• Размер значения – это длина это последовательности байтов
• Битовое поле – это непрерывная последовательность битов
памяти
• Размер битового поля – это длина это последовательности битов
• Хранятся внутри значений целых типов
• Используются довольно редко
126
127.
Двоичное представление значений• Для значений unsigned char хранится двоичная запись значения
• Любое значение типа Т размером N байтов можно скопировать в массив
типа unsigned char[N]
• Значение этого массива называется двоичным представлением значения типа Т
• Значения, отличные от NaN-ов и имеющие одинаковое двоичное представление, равны
• Равные значения могут иметь разное двоичное представление
• Некоторые значения типа unsigned char[N] могут не быть двоичным
представлением никакого значения типа Т размером N байтов
• Такие значения называются особыми значениями
• Доступ и изменение двоичного представления особых значений иначе, чем
через символьный тип, ведет к undefined behavior
127
128.
Двоичное представление значений• Для значений unsigned char хранится двоичная запись значения
• Любое значение типа Т размером N байтов можно скопировать в
массив типа unsigned char[N]
• Значение этого массива называется двоичным представлением значения типа Т
• Значения, отличные от NaN-ов и имеющие одинаковое двоичное
представление, равны
• Равные значения могут иметь разное двоичное представление
• Некоторые значения типа unsigned char[N] могут не быть двоичным
представлением никакого значения типа Т размером N байтов
• Такие значения называются особыми значениями
• Доступ и изменение двоичного представления особых значений иначе, чем
через символьный тип, ведет к undefined behavior
128
129.
Двоичное представление значений• Для значений unsigned char хранится двоичная запись значения
• Любое значение типа Т размером N байтов можно скопировать в
массив типа unsigned char[N]
• Значение этого массива называется двоичным представлением значения типа Т
• Значения, отличные от NaN-ов и имеющие одинаковое двоичное
представление, равны
• Равные значения могут иметь разное двоичное представление
• Некоторые значения типа unsigned char[N] могут не быть двоичным
представлением никакого значения типа Т размером N байтов
• Такие значения называются особыми значениями
• оступ и изменение двоичного представления особых значений иначе, чем через
символьный тип, ведет к undefined behavior
129
130.
Двоичное представление значений• Для значений unsigned char хранится двоичная запись значения
• Любое значение типа Т размером N байтов можно скопировать в
массив типа unsigned char[N]
• Значение этого массива называется двоичным представлением значения типа Т
• Значения, отличные от NaN-ов и имеющие одинаковое двоичное
представление, равны
• Равные значения могут иметь разное двоичное представление
• Некоторые значения типа unsigned char[N] могут не быть двоичным
представлением никакого значения типа Т размером N байтов
• Такие значения называются особыми значениями
• Доступ и изменение двоичного представления особых значений иначе, чем
через символьный тип, ведет к undefined behavior
130
131.
Двоичное представление значений• Для значений unsigned char хранится двоичная запись значения
• Любое значение типа Т размером N байтов можно скопировать в
массив типа unsigned char[N]
• Значение этого массива называется двоичным представлением значения типа Т
• Значения, отличные от NaN-ов и имеющие одинаковое двоичное
представление, равны
• Равные значения могут иметь разное двоичное представление
• Некоторые значения типа unsigned char[N] могут не быть двоичным
представлением никакого значения типа Т размером N байтов
• Такие значения называются особыми значениями
• Доступ и изменение двоичного представления особых значений иначе, чем
через символьный тип, -- это undefined behavior
131
132.
Представление беззнаковых целых типов• Двоичное представление значения беззнакового целого типа !=
unsigned char делится на
• Значащие биты
• Разложение значения по степеням 2 от 1 до 2^(число значащих битов - 1)
• Выравнивающие биты
• Значение не определено
• Как правило отсутствуют – implementation defined
• Двоичное представление unsigned char не содержит
выравнивающих битов
132
133.
Представление беззнаковых целых типов• Двоичное представление значения беззнакового целого типа !=
unsigned char делится на
• Значащие биты
• Разложение значения по степеням 2 от 1 до 2^(число значащих битов - 1)
• Выравнивающие биты
• Значение не определено
• Как правило отсутствуют – implementation defined
• Двоичное представление unsigned char не содержит
выравнивающих битов
133
134.
Представление беззнаковых целых типов• Двоичное представление значения беззнакового целого типа !=
unsigned char делится на
• Значащие биты
• Разложение значения по степеням 2 от 1 до 2число значащих битов - 1
• Выравнивающие биты
• Значение не определено
• Как правило отсутствуют – implementation defined
• Двоичное представление unsigned char не содержит
выравнивающих битов
134
135.
Представление беззнаковых целых типов• Двоичное представление значения беззнакового целого типа !=
unsigned char делится на
• Значащие биты
• Разложение значения по степеням 2 от 1 до 2число значащих битов - 1
• Выравнивающие биты
• Значение не определено
• Как правило отсутствуют – implementation defined
• Двоичное представление unsigned char не содержит
выравнивающих битов
135
136.
Представление беззнаковых целых типов• Двоичное представление значения беззнакового целого типа !=
unsigned char делится на
• Значащие биты
• Разложение значения по степеням 2 от 1 до 2число значащих битов - 1
• Выравнивающие биты
• Значение не определено
• Как правило отсутствуют – implementation defined
• Двоичное представление unsigned char не содержит
выравнивающих битов
136
137.
Представление беззнаковых целых типовn
2n-2 2 -1
0 1
2
+1
2n-1 2n-1-1
137
138.
Представление знаковых целых типов• Значащие биты
• Разложение вспомогательного
значения X по степеням 2 от 1 до
2число значащих битов - 1
• Выбор X зависит от знакового бита
• Знаковый бит
• Знаковый бит = 0
• значением является X
• Знаковый бит = 1
• значением является implementation
defined одно из
• –X
• «знак и абсолютная величина»
• X – 2число значащих битов
• Выравнивающие биты
• Значение не определено
• Как правило отсутствуют –
implementation defined
• «дополнительный код»,
«дополнение до нуля»
• X – 2число значащих битов + 1
• «дополнительный код плюс один»,
«дополнение до единицы»
138
139.
Представление знаковых целых типов• Значащие биты
• Разложение вспомогательного
значения X по степеням 2 от 1 до
2число значащих битов - 1
• Выбор X зависит от знакового бита
• Знаковый бит
• Знаковый бит = 0
• значением является X
• Знаковый бит = 1
• значением является implementation
defined одно из
• –X
• «знак и абсолютная величина»
• X – 2число значащих битов
• Выравнивающие биты
• Значение не определено
• Как правило отсутствуют –
implementation defined
• «дополнительный код»,
«дополнение до нуля»
• X – 2число значащих битов + 1
• «дополнительный код плюс один»,
«дополнение до единицы»
139
140.
Представление знаковых целых типов• Значащие биты
• Разложение вспомогательного
значения X по степеням 2 от 1 до
2число значащих битов - 1
• Выбор X зависит от знакового бита
• Знаковый бит
• Знаковый бит = 0
• значением является X
• Знаковый бит = 1
• значением является implementation
defined одно из
• –X
• «знак и абсолютная величина»
• X – 2число значащих битов
• Выравнивающие биты
• Значение не определено
• Как правило отсутствуют –
implementation defined
• «дополнительный код»,
«дополнение до нуля»
• X – 2число значащих битов + 1
• «дополнительный код плюс один»,
«дополнение до единицы»
140
141.
Представление знаковых целых типов• Значащие биты
• Разложение вспомогательного
значения X по степеням 2 от 1 до
2число значащих битов - 1
• Выбор X зависит от знакового бита
• Знаковый бит
• Знаковый бит = 0
• значением является X
• Знаковый бит = 1
• значением является implementation
defined одно из
• –X
• «знак и абсолютная величина»
• X – 2число значащих битов
• Выравнивающие биты
• Значение не определено
• Как правило отсутствуют –
implementation defined
• «дополнительный код»,
«дополнение до нуля»
• X – 2число значащих битов + 1
• «дополнительный код плюс один»,
«дополнение до единицы»
141
142.
Представление знаковых целых типов• Значащие биты
• Разложение вспомогательного
значения X по степеням 2 от 1 до
2число значащих битов - 1
• Выбор X зависит от знакового бита
• Знаковый бит
• Знаковый бит = 0
• значением является X
• Знаковый бит = 1
• значением является implementation
defined одно из
• –X
• «знак и абсолютная величина»
• X – 2число значащих битов
• Выравнивающие биты
• Значение не определено
• Как правило отсутствуют –
implementation defined
• «дополнительный код»,
«дополнение до нуля»
• X – 2число значащих битов + 1
• «дополнительный код плюс один»,
«дополнение до единицы»
142
143.
Представление знаковых целых типов• Значащие биты
• Разложение вспомогательного
значения X по степеням 2 от 1 до
2число значащих битов - 1
• Выбор X зависит от знакового бита
• Знаковый бит
• Знаковый бит = 0
• значением является X
• Знаковый бит = 1
• значением является implementation
defined одно из
• –X
• «знак и абсолютная величина»
• X – 2число значащих битов
• Выравнивающие биты
• Значение не определено
• Как правило отсутствуют –
implementation defined
• «дополнительный код»,
«дополнение до нуля»
• X – 2число значащих битов + 1
• «дополнительный код плюс один»,
«дополнение до единицы»
143
144.
Представление знаковых целых типов• Значащие биты
• Разложение вспомогательного
значения X по степеням 2 от 1 до
2число значащих битов - 1
• Выбор X зависит от знакового бита
• Знаковый бит
• Знаковый бит = 0
• значением является X
• Знаковый бит = 1
• значением является implementation
defined одно из
• –X
• «знак и абсолютная величина»
• X – 2число значащих битов
• Выравнивающие биты
• Значение не определено
• Как правило отсутствуют –
implementation defined
• «дополнительный код»,
«дополнение до нуля»
• X – 2число значащих битов + 1
• «дополнительный код плюс один»,
«дополнение до единицы»
144
145.
Представление знаковых целых типов• Значащие биты
• Разложение вспомогательного
значения X по степеням 2 от 1 до
2число значащих битов - 1
• Выбор X зависит от знакового бита
• Знаковый бит
• Знаковый бит = 0
• значением является X
• Знаковый бит = 1
• значением является implementation
defined одно из
• –X
• «знак и абсолютная величина»
• X – 2число значащих битов
• Выравнивающие биты
• Значение не определено
• Как правило отсутствуют –
implementation defined
• «дополнительный код»,
«дополнение до нуля»
• X – 2число значащих битов + 1
• «дополнительный код плюс один»,
«дополнение до единицы»
145
146.
Представление знаковых целых типов• Значащие биты
• Разложение вспомогательного
значения X по степеням 2 от 1 до
2число значащих битов - 1
• Выбор X зависит от знакового бита
• Знаковый бит
• Знаковый бит = 0
• значением является X
• Знаковый бит = 1
• значением является implementation
defined одно из
• –X
• «знак и абсолютная величина»
• X – 2число значащих битов
• Выравнивающие биты
• Значение не определено
• Как правило отсутствуют –
implementation defined
• «дополнительный код»,
«дополнение до нуля»
• X – 2число значащих битов + 1
99.99%
всех
реализаций
• «дополнительный код плюс один»,
«дополнение до единицы»
146
147.
Представление знаковых целых типов-1
-2 -1 0 1
2
+1
Для чисел в
дополнительном
коде
-(-2n-1) = -2n-1
-2n-1 2n-1-1
147
148.
Особые значения знаковых целых типов• Являются implementation defined
• Если «дополнительный код» или «знак и абсолютная величина», то
знаковый бит=1 и все значащие биты=0
• Если «дополнительный код плюс один», то знаковый бит=1 и все
значащие биты=1
148
149.
Особые значения знаковых целых типов• Являются implementation defined
• Если «дополнительный код» или «знак и абсолютная величина», то
знаковый бит=1 и все значащие биты=0
• Если «дополнительный код плюс один», то знаковый бит=1 и все
значащие биты=1
149
150.
Особые значения знаковых целых типов• Являются implementation defined
• Если «дополнительный код» или «знак и абсолютная величина», то
знаковый бит=1 и все значащие биты=0
• Если «дополнительный код плюс один», то знаковый бит=1 и все
значащие биты=1
150
151.
Представление double – стандарт IEEE 754Знак
(11 битов)
Порядок
63
56 55
(52 бита)
Мантисса
48 47
40 39
32 31
24 23
16 15
8 7
Порядок
Мантисса 0
Мантисса != 0
Формула
0x000
0 и -0
Денормализов.
числа
(-1)знак∙2порядок-1022∙(0.мантисса)(2)
0x001 … 0x7fe
Нормализованные числа
0x7ff
+ или -
0
(-1)знак∙2порядок-1023∙(1.мантисса)(2)
NaN
3ff0 0000 0000 0000(16) = 1
0000 0000 0000 0000(16) = 0
7ff0 0000 0000 0000(16) = ∞
3ff0 0000 0000 0001(16) ≈
1.0000000000000002
8000 0000 0000 0000(16) = –0
fff0 0000 0000 0000(16) = −∞
3fd5 5555 5555 5555(16) ≈ 1/3
151
152.
Представление float – стандарт IEEE 754Знак
(8 битов)
Порядок
(23 бита)
Мантисса
Порядок
Мантисса 0
Мантисса != 0
Формула
0x00
0 и -0
Денормализов.
числа
(-1)знак∙2порядок-126∙(0.мантисса)(2)
0x01 … 0xfe
Нормализованные числа
0xff
+ или -
(-1)знак∙2порядок-127∙(1.мантисса)(2)
NaN
152
153.
Представление float – стандарт IEEE 754223
значений
типа float
-inf
( -2128)
-2127
-2
-1 -½ 0 ½ 1
2
2127
inf
( 2128)
Относительная погрешность = const
Абсолютная погрешность чем ближе к нулю, тем меньше
153
154.
Представление массивов• Двоичное представление значения типа массив состоит из
двоичных представлений значений его элементов
• Представления значений элементов непрерывно расположены в памяти
в порядке возрастания индексов
• Значение массива не является особым
• Даже значение какого-то элемента является особым
• То есть доступ к элементу массива всегда возможен
154
155.
Представление массивов• Двоичное представление значения типа массив состоит из
двоичных представлений значений его элементов
• Представления значений элементов непрерывно расположены в памяти
в порядке возрастания индексов
• Значение массива не является особым
• Даже значение какого-то элемента является особым
• То есть доступ к элементу массива всегда возможен
155
156.
Представление массивов• Двоичное представление значения типа массив состоит из
двоичных представлений значений его элементов
• Представления значений элементов непрерывно расположены в памяти
в порядке возрастания индексов
• Значение массива не является особым
• Даже если значение какого-то элемента является особым
156
157.
Представление структур• Двоичное представление значения типа структура состоит из двоичных
представлений значений его элементов и выравнивающих байтов
• Представления значений элементов расположены в памяти в порядке описания
элементов в списке элементов
• Между представлениями значений элементов могут быть выравнивающие
байты
• Значения выравнивающих байтов не определены
• Значение структуры никогда не является особым
• Даже если значение какого-то их элемента является особым
• То есть доступ к элементам структур и объединений всегда возможен
157
158.
Представление структур• Двоичное представление значения типа структура состоит из
двоичных представлений значений его элементов и
выравнивающих байтов
• Представления значений элементов расположены в памяти в порядке
описания элементов в списке элементов
• Между представлениями значений элементов могут быть
выравнивающие байты
• Значения выравнивающих байтов не определены
• Значение структуры никогда не является особым
• Даже если значение какого-то их элемента является особым
158
159.
Представление структур• Двоичное представление значения типа структура состоит из
двоичных представлений значений его элементов и
выравнивающих байтов
• Представления значений элементов расположены в памяти в порядке
описания элементов в списке элементов
• Между представлениями значений элементов могут быть
выравнивающие байты
• Значения выравнивающих байтов не определены
• Значение структуры никогда не является особым
• Даже если значение какого-то их элемента является особым
159
160.
Представление структур• Двоичное представление значения типа структура состоит из
двоичных представлений значений его элементов и
выравнивающих байтов
• Представления значений элементов расположены в памяти в порядке
описания элементов в списке элементов
• Между представлениями значений элементов могут быть
выравнивающие байты
• Значения выравнивающих байтов не определены
• Значение структуры никогда не является особым
• Даже если значение какого-то их элемента является особым
160
161.
Представление структур• Двоичное представление значения типа структура состоит из
двоичных представлений значений его элементов и
выравнивающих байтов
• Представления значений элементов расположены в памяти в порядке
описания элементов в списке элементов
• Между представлениями значений элементов могут быть
выравнивающие байты
• Значения выравнивающих байтов не определены
• Значение структуры никогда не является особым
• Даже если значение какого-то элемента является особым
161
162.
Представление объединений• Двоичное представление значения типа объединение состоит из
двоичного представления значения одного из его элементов, за
которым могут следовать выравнивающие байты
• Значения выравнивающих байтов не определены
• Значение объединения никогда не является особым
• Даже если значение какого-то элемента является особым
• То есть доступ к элементам объединения всегда well-defined
162
163.
Представление объединений• Двоичное представление значения типа объединение состоит из
двоичного представления значения одного из его элементов, за
которым могут следовать выравнивающие байты
• Значения выравнивающих байтов не определены
• Значение объединения никогда не является особым
• Даже если значение какого-то элемента является особым
• То есть доступ к элементам объединения всегда well-defined
163
164.
Представление объединений• Двоичное представление значения типа объединение состоит из
двоичного представления значения одного из его элементов, за
которым могут следовать выравнивающие байты
• Значения выравнивающих байтов не определены
• Значение объединения никогда не является особым
• Даже если значение какого-то элемента является особым
164
165.
Заключение• Что такое тип и система типов?
• Классификация типов языка Си
• Функциональные
• Полные
• Целые, с плавающей точкой, и т.п.
• Неполные
• void и другие
• Представление типов в памяти
165
166.
Композиция типов 1/2Композицией совместимых типов Т1 и Т2 называется тип, построенный по правилам:
• Если Т1 (или Т2) – это массив фиксированного размера, то Т1 (соотв. Т2)
• С99: Если Т1 (или Т2) – это массив переменного размера, то Т1 (соотв. Т2)
• Если Т1 (или Т2) – это прототип функции (т.е. функция с списком формальных
параметров), то Т1 (соотв. Т2)
• Если Т1 и Т2 – это прототипы функций, то тип формального параметра композиции
является композицией типов формальных параметров
• Если T1 и T2 – это производные типы, то правила применяются рекурсивно к типам,
от которых произведены Т1 и Т2
166
167.
Композиция типов 2/2• Единица трансляции А
int f(int(*)(), double(*)[3]);
• Единица трансляции Б
int f(int(*)(char *), double(*)[]);
• Композиция типов функции f
int f(int(*)(char *), double(*)[3]);
167