691.78K
Category: programmingprogramming

Система типов языка Си. Лекция 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 754
223
значений
типа 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
English     Русский Rules