НРТК
Целочисленные типы С/C++
Размеры типов С/C++
Размеры типов С/C++
Размеры типов С/C++
Числовые константы
Числовые константы вида ‘a’
Действительные типы С/C++
Действительные константы
Другие фундаментальные типы
Другие фундаментальные типы
Неявные преобразования типов
Явные преобразования типов
Явные преобразования типов
Стандартные именованные константы
Стандартные именованные константы
Объявление синонима типа
Перечисленный тип enum
Перечисленный тип enum
Блок
Время жизни и области видимости
Время жизни и области видимости
Время жизни и области видимости
И еще о блоках
Операции C++: 1
Операции C++: 2
Операции C++: 3-6
Операции C++: 7-13
Операции C++: 14, 15
Выражения
Выражения
Выражения (примеры)
Операция «,» (запятая)
Операция «?» (знак вопроса)
Двоичный дополнительный код
Примеры вычислений
Примеры побитовых вычислений
Сдвиги
Задачи
290.07K
Категория: ПрограммированиеПрограммирование

Фундаментальные типы данных и операции. С / С++. Тема 06

1. НРТК

С / С++
Тема 06. Фундаментальные типы
данных и операции
НРТК, 2022 г. 1
Фундаментальные типы данных и операции
Созонов А.А.

2.

Целочисленные типы данных
НРТК, 2022 г. 2
Фундаментальные типы данных и операции
Созонов А.А.

3. Целочисленные типы С/C++


Целочисленные типы и модификаторы:
[unsigned] char
[unsigned] int
К типу int можно добавить определитель для
«более точного» задания диапазона значений:
[unsigned] short int
[unsigned] long int
Тогда int можно опустить:
short ≡ short int, long ≡ long int
Явное указание знакового типа:
signed char, ..., signed long
unsigned ≡ unsigned int
НРТК, 2022 г. 3
Фундаментальные типы данных и операции
Созонов А.А.

4. Размеры типов С/C++

• Размер (количество байт) типов не
определен, но может быть вычислен:
sizeof(int)
sizeof(a)
• Количество бит в байте не определено
• Определены соотношения между
размерами
1 ≡ sizeof(char) ≤ sizeof(short) ≤
sizeof(int) ≤ sizeof(long)
sizeof(T) ≡ sizeof(signed T) ≡
sizeof(unsigned T)
НРТК, 2022 г. 4
Фундаментальные типы данных и операции
Созонов А.А.

5. Размеры типов С/C++

• Известна минимальная емкость типов



— минимум 8 бит
short — минимум 16 бит
long — минимум 32 бита
char
Размер, байт
Тип
char
int
long
НРТК, 2022 г. 5
Borland C++ Borland C++ GCC (IPF, 64
3.1
Builder 5.0
бит)
1
1
1
2
4
4
4
4
8
Фундаментальные типы данных и операции
Созонов А.А.

6. Размеры типов С/C++

Емкость типов в Microsoft Visual Studio 2005
Диапазон значений
Тип
signed
unsigned
Байт
char
1
[-128; 127]
[0; 255]
short
2
[-32 768; 32 767]
[0; 65 535]
int
4 [-2 147 483 648; 2 147 483 647] [0; 4 294 967 295]
long
4 [-2 147 483 648; 2 147 483 647] [0; 4 294 967 295]
НРТК, 2022 г. 6
Фундаментальные типы данных и операции
Созонов А.А.

7. Числовые константы

Целочисленные:
Десятичные
Восьмеричные
Форма: [-]DDD[U][L] Форма: [-]0BBB[U][L]
[-]DDD[u][l]
123
0375
-894567
-0777L
23L (23l)
479ul
Шестнадцатеричные
Форма: [-]0xHHH[U][L]
[-]0XHHH[u][l]
0xABA
-0XBABAL
0x7FFuL
Если нет явного указания типа, то тип будет:
• int, если он недостаточен, то long
int — для
десятичных констант
первым подходящим среди int, unsigned int, long
int, unsigned long int — для восьмеричных или
шестнадцатеричных констант
НРТК, 2022 г. 7
Фундаментальные типы данных и операции
Созонов А.А.

8. Числовые константы вида ‘a’

• Вывод шестнадцатеричного представления
числа
int n;
char ch;
cout << "n = ";
cin >> n;
if ( n < 10 ) ch = '0' + n;
else
ch = 'A' + n - 10;
• Эта программа соответствует Стандарту, но
непереносима!
• Целые многосимвольные константы
int i1, i2;
i1 = 'aba';
i2 = i1 + 0x0000200;
НРТК, 2022 г. 8
// i1 содержит 0|'a'|'b'|'a'
// i2 содержит 0|'a'|'d'|'a'
Фундаментальные типы данных и операции
Созонов А.А.

9.

Объявления и инициализация
int i = 18;
unsigned u = -045u, u1 = 0xADAu;
char c = -127, c1 = 's';
long a = 5672L;
unsigned long ul = 0XFFFFFUL;
НРТК, 2022 г. 9
Фундаментальные типы данных и операции
Созонов А.А.

10.

Действительный тип данных
НРТК, 2022 г. 10
Фундаментальные типы данных и операции
Созонов А.А.

11. Действительные типы С/C++

• Действительные типы:
float
double
long double
• Определены соотношения между
размерами (и точностями)
sizeof(float) ≤ sizeof(double) ≤ sizeof(long double)
Тип
Байт Значность
float
4
6
double
8
15
long double
8
15
НРТК, 2022 г. 11
Диапазон положительных
значений
[1,1755·10-38; 3,4028·10+38]
[2,2250·10-308; 1,7977·10+308]
[2,2250·10-308; 1,7977·10+308]
Фундаментальные типы данных и операции
Созонов А.А.

12. Действительные константы

• Синтаксис:
[nn][.][mmm][E/e[+/-]pp]
• Примеры:
23.56
nn
-3.45e-6
или mmm (но не обе сразу) можно опустить
1.
.23
• Десятичную точку или E/e (но не обе сразу)
можно опустить:
1e0
245e-7
• десятичная константа имеет тип double; для
long double — суффикс L/l:
2.25e2L
НРТК, 2022 г. 12
Фундаментальные типы данных и операции
Созонов А.А.

13.

Другие фундаментальные типы
данных
НРТК, 2022 г. 13
Фундаментальные типы данных и операции
Созонов А.А.

14. Другие фундаментальные типы

• Логический тип bool
– размер:
1 ≤ sizeof(bool) ≤ sizeof(long)
sizeof(bool) = 1
– возможные значения: true, false
– преобразования в (из) int:
int i1 = 12;
bool b = i1;
int i2 = b;
// b = true
// i2 = 1
• В C тип bool не является встроенным и
доступен после подключения заголовочного
файла stdbool.h
НРТК, 2022 г. 14
Фундаментальные типы данных и операции
Созонов А.А.

15. Другие фундаментальные типы

• Тип «отсутствие типа» void
– не имеет размера, а значит нельзя создавать
переменные
– типичное применение — возврат значения из
функции
void f();
• Тип для «широких символов» wchar_t
– предназначен для поддержки «больших»
символьных наборов, таких как Unicode
– размер
sizeof(char) ≤ sizeof(wchar_t) ≤ sizeof(long)
sizeof(wchar_t) = 2
– объявление констант:
wchar_t wch = L'a';
НРТК, 2022 г. 15
Фундаментальные типы данных и операции
Созонов А.А.

16. Неявные преобразования типов

• Безопасные, для приведения аргументов к
общему типу
целое float double long double
char, short int unsigned long
unsigned long
• Преобразования с потерей точности
дробное целое
тип менее емкий тип
• Примеры
short s = 0x123456789ABul; // s = 0x89AB
int
i = 0.7e3 * 0.11e4; // i = 770000
НРТК, 2022 г. 16
Фундаментальные типы данных и операции
Созонов А.А.

17. Явные преобразования типов

• C: (<тип>)<выражение>
– пример:
i = j * (int)(2.0 * b);
• Ранний C++: <тип>(<выражение>)
– пример:
i = j * int(2.0 * b);
– нельзя использовать для типов, не имеющих
простого имени:
unsigned long (x/3.0 + 2.0)
НРТК, 2022 г. 17
Фундаментальные типы данных и операции
Созонов А.А.

18. Явные преобразования типов

• Современный C++: семейство *_cast<Тип>(выражен.)
– static_cast — преобразование родственных типов
(целое в перечисление, действительное в целое, …):
i = j * static_cast<int>(2.0 * b);
– reinterpet_cast — преобразование неродственных
типов:
int array[10];
unsigned address =
reinterpret_cast<unsigned>(array);
– const_cast — снятие атрибута константности с членов
класса
const int cc = 2;
const_cast<int>(cc);
// так не выйдет!!
– dynamic_cast — динамическое приведение типа для
объектов класса
НРТК, 2022 г. 18
Фундаментальные типы данных и операции
Созонов А.А.

19.

Именованные константы
НРТК, 2022 г. 19
Фундаментальные типы данных и операции
Созонов А.А.

20.

Именованные константы
Пример: длина окружности и площадь круга:
const double PI = 3.14;
#define PI 3.14
double r, ld, s;
cin >> r;
ld = 2. * PI * r;
s = PI * r * r;
double r, ld, s;
cin >> r;
ld = 2. * PI * r;
s = PI * r * r;
const int max_size = 100;
double array[max_size];
#define value 1
...
// "Непонятная" ошибка:
int value = 2;
Никаких неименованных констант в тексте
программы, кроме 0 и 1
Добавление const к T фактически создает новый
тип — const T
НРТК, 2022 г. 20
Фундаментальные типы данных и операции
Созонов А.А.

21. Стандартные именованные константы

• Библиотека climits (в C — limits.h)
SHRT_MAX
INT_MAX
LONG_MAX
32767
2147483647
2147483647L
• Библиотека cfloat (в C — float.h)
FLT_MAX
FLT_MIN
FLT_EPSILON
DBL_MAX
DBL_MIN
DBL_EPSILON
НРТК, 2022 г. 21
3.402823466e+38F
1.175494351e-38F
1.192092896e-07F
1.7976931348623158e+308
2.2250738585072014e-308
2.2204460492503131e-016
Фундаментальные типы данных и операции
Созонов А.А.

22. Стандартные именованные константы

• C++ библиотека limits
numeric_limits< <тип> >::<возможность>
• Доступны следующие возможности:
– digits — количество двоичных разрядов в типе
– has_infinity — есть ли значение «бесконечность»
– is_signed — является ли тип знаковым
– max — максимальное положительное значение,
которое может храниться в типе
–…
• Пример:
Подробнее
bool has_infinity =
numeric_limits<double>::has_infinity;
НРТК, 2022 г. 22
Фундаментальные типы данных и операции
Созонов А.А.

23.

Пользовательские типы данных
НРТК, 2022 г. 23
Фундаментальные типы данных и операции
Созонов А.А.

24. Объявление синонима типа

• Синтаксис:
typedef <имя_старого_типа> <имя_нового_типа>;
• Создает синоним (новое имя) для типа
<имя_старого_типа>
• Примеры:
typedef unsigned int uint32;
typedef int bool;
// В C в stdbool.h
typedef unsigned int size_t; // В <cstddef>
• Типичное применение:
– введение сокращенного имени типа
– сведение зависимостей в одну точку
• Старый и новый тип равнозначны
НРТК, 2022 г. 24
Фундаментальные типы данных и операции
Созонов А.А.

25. Перечисленный тип enum

• Синтаксис:
enum <имя_типа> {<значение1>,... ,<значениеn>};
• Создает новый тип (с емкостью не больше
int), можно создавать переменные этого типа:
enum DayOfWeek {Sunday, Monday,..., Saturday};
DayOfWeek today = Sunday;
почти эквивалентно:
const int
const int
...
const int
int today
НРТК, 2022 г. 25
Sunday
Monday
= 0;
= 1;
Saturday = 6;
= Sunday;
Фундаментальные типы данных и операции
Созонов А.А.

26. Перечисленный тип enum

• Можно сразу создать переменную, без
именования типа:
enum {Up, Down} direction;
• Числовые значения значений enum можно
устанавливать при объявлении:
enum Boys {John, Paul, George = 8, Ringo};
тогда:
John = 0, Paul = 1, George = 8, Ringo = 9
• Неявные преобразования в int (обратного
неявного преобразования нет!):
int one = Paul;
Boys Pit = static_cast<Boys>(George + 1);
НРТК, 2022 г. 26
Фундаментальные типы данных и операции
Созонов А.А.

27.

Блок
НРТК, 2022 г. 27
Фундаментальные типы данных и операции
Созонов А.А.

28. Блок

• Группа операторов в фигурных скобках,
составляющее некоторое целое (тело цикла,
варианты у if, тело функции):
{
a = b + c;
...
}
• В блоке могут быть объявлены (и
инициированы) переменные:
{
int c = a + b;
...
}
НРТК, 2022 г. 28
Фундаментальные типы данных и операции
Созонов А.А.

29. Время жизни и области видимости

• Объявленные в блоке переменные являются
локальными — они «видны» (и существуют)
только внутри блока
• Блоки могут вкладываться, а объявленные
переменные — перекрываться:
{
int a = 3;
double b = 2.0;
{
int a, b; // Эти a и b перекрывают внешние
a = 5;
// присваивание локальной a
}
// Здесь опять внешние a и b, a = 3, b = 2.0
}
НРТК, 2022 г. 29
Фундаментальные типы данных и операции
Созонов А.А.

30. Время жизни и области видимости

• Время жизни переменной — это участок
программы от момента ее объявления и до
конца блока
• Область видимости переменной — это
время ее жизни минус области перекрытия
имени
НРТК, 2022 г. 30
Фундаментальные типы данных и операции
Созонов А.А.

31. Время жизни и области видимости

НРТК, 2022 г. 31
Время жизни a(2) и b(2)
Время жизни b(1)
Фундаментальные типы данных и операции
Созонов А.А.
Область видимости a(1)
}
Область видимости b(1)
int a(1) = 3;
double b(1) = 2.0;
...
{
int a(2), b(2);
a(2) = 5;
...
}
...
Область видимости a(2) и b(2)
Время жизни a(1)
{

32. И еще о блоках

• С vs. C++
– в C переменные могут объявляться только в начале
блока
– в C++ переменные могут объявляться в любом месте
блока
• В C++ переменные можно объявлять в
заголовках циклов for, while, в if и switch:
for ( int i = 0; i < n; i++ )...
while ( double s = sin(alpha) != 0.0 )...
if ( int sign = value >= 0 ? 1 : -1 )...
switch( int b = a + 1 )...
НРТК, 2022 г. 32
Фундаментальные типы данных и операции
Созонов А.А.

33.

Операции над числовыми данными
НРТК, 2022 г. 33
Фундаментальные типы данных и операции
Созонов А.А.

34. Операции C++: 1

Прио
Операция
ритет
1
Название
Пример
::
имя_класса::член_класса
разрешение
области видимости
->
выбор члена
указатель->член_класса
[]
индексация
int array[30];
()
вызов
выражение(список_аргументов)
sizeof
размер объекта
size_t s = sizeof(d * 3.14);
// s=8
sizeof
размер типа
struct
size_t
size_t
size_t
S { int a; double b; };
s1=sizeof(int);
//s1=4
s2=sizeof(double); //s2=8
s3=sizeof(S);
//s3=16
Значения размеров зависят от реализации
НРТК, 2022 г. 34
Фундаментальные типы данных и операции
Созонов А.А.

35. Операции C++: 2

Прио
ритет
2
Операция
Название
Пример
++
приращение на 1
j = ++a + ++b;
--
уменьшение на 1
j = aa-- - --b;
~
поразрядное не
char c1=0xF0, c2=~c1; // c1=0X0F
!
логическое не
c1 = !c2; // c1 = 0 (0x00)
-
унарный минус
i = -a * b / c;
&
адрес объекта
int a = 3; int* p = &a;
*
разыменование
int b = *p;
new
создание
(размещение)
int* p1 = new int;
new[]
создание вектора
int* array = new int[30];
delete
уничтожение
delete p1;
delete[]
уничтожение
вектора
delete[] array;
()
приведение типа
int a =(int)3.14*8.29; // a = 24
НРТК, 2022 г. 35
Фундаментальные типы данных и операции
Созонов А.А.

36. Операции C++: 3-6

Прио
ритет
3
4
Операция
Название
*
умножение
выр * выр
/
деление
выр / выр
%
взятие по модулю
(остаток)
выр % выр
+
сложение (плюс)
выр + выр
-
вычитание (минус)
выр - выр
<<
сдвиг влево
int j, k, i = 4;
k = i << 2; // 16
>>
сдвиг вправо
j = k >> 2; // 1
<
меньше
i = f + 7 < d * p;
<=
меньше или равно
выр <= выр
>
больше
выр > выр
>=
больше или равно
выр >= выр
5
6
Пример
НРТК, 2022 г. 36
Фундаментальные типы данных и операции
// 0 или 1
Созонов А.А.

37. Операции C++: 7-13

Прио
ритет
7
8
9
10
11
12
Операция
Название
Пример
==
равно
выр == выр
!=
не равно
выр != выр
&
побитовое И
unsigned i, j = 0535, k = 01234;
i = k & 07 << 6; // i = 0200
^
побитовое
исключающее ИЛИ
i = k ^ 07 << 3; // i =
1244
|
побитовое
включающее ИЛИ
i = k | j;
// i =
1735
&&
логическое И
i = a+3 && b/7.
// 0 или 1
||
логическое
включающее ИЛИ
выр || выр
? :
арифметический if
выр ? выр : выр
i = a < b ? a + b : a - b;
j = p / a < b ? a : b;
13
НРТК, 2022 г. 37
Фундаментальные типы данных и операции
Созонов А.А.

38. Операции C++: 14, 15

Прио
ритет
14
15
Операция
Название
Пример
=
простое присваивание
a = b;
*=
умножить и присвоить
a *= b;
// a = a * b;
/=
разделить и присвоить
a /= b;
// a = a / b;
%=
взять по модулю и присвоить
a %= b;
// a = a % b;
+=
сложить и присвоить
a += b;
// a = a + b;
-=
вычесть и присвоить
a *= b;
// a = a - b;
<<=
сдвинуть влево и присвоить
a <<= k; // a = a << k;
>>=
сдвинуть вправо и присвоить
a >>= k; // a = a >> k;
&=
И и присвоить
a &= b;
// a = a & b;
|=
включающее ИЛИ и
присвоить
a |= b;
// a = a | b;
^=
исключающее ИЛИ и
присвоить
a ^= b;
// a = a ^ b;
,
запятая (последование)
выр , выр
НРТК, 2022 г. 38
Фундаментальные типы данных и операции
Созонов А.А.

39. Выражения

• Правило приоритетов — обычное
• Унарные операции и операции присваивания
правоассоциативны, остальные —
левоассоциативны
Прр.
Операции
1
() [] -> .
2
~
++ -- - f
(тип) * & sizeof
3
*
4
+
5
<<
6
<
7
==
8
&
/
%
Прр
9
10
Операции
Ассоц.
^
|
11
&&
-
12
||
>>
13
?:
14
= += ...
15
,
<=
НРТК, 2022 г. 39
Ассоц.
>
!=
>=
Фундаментальные типы данных и операции
Созонов А.А.

40. Выражения

• Порядок вычислений подвыражений в
выражениях не определен:
int i = 1;
int v[2];
v[i] = i++; // Неопределенно:
// или v[1]=1, или v[2]=1, или ...
• Порядок определен только для , (запятая), &&
(логическое И) и || (логическое ИЛИ) — слева
направо
• Для логических операций применяется
быстрое вычисление значений
if ( ( 0 < 1 ) && ( b > 0 ) ) ...
НРТК, 2022 г. 40
Фундаментальные типы данных и операции
Созонов А.А.

41. Выражения (примеры)

Выражение
a = b = c
a + b + c
d = a + b * c
(d = a) + b * c
*p++
v[i] = i++;
*(v+i) = i++;
НРТК, 2022 г. 41
Что означает
b = c
// (=)
a = b = c
// (=)
a + b
// (+)
a + b + c
// (+)
b * c
// приор.
a + b * c
// приор.
d = a + b * c
// приор.
(d = a)
// () (+)
b * c // приор. (+)
(d = a) + b * c
p++
// (++)
*p++
// (*)
v[i]
// приор. [] выше (=)
i++
// (=)
v[i] = i++
(v+i)
// ()
i++;
// приор.(* ++) > приор.(=) (* ++)
*(v+i)
// (* ++)
*(v+i) = i++;
Фундаментальные типы данных и операции
Созонов А.А.

42. Операция «,» (запятая)

• Синтаксис:
<выражение1>, <выражение2>,... , <выражениеn>
• Последовательно вычисляются все
выражения
• Значение оператора — значение самого
правого выражения
• Примеры:
int a, b;
b = (a = 2, a + 1);
// b = 3
for(int i = 0, j = 0; (i <= 1000) &&
(j <= 2000); i++, j += 2) cout << i * j;
НРТК, 2022 г. 42
Фундаментальные типы данных и операции
Созонов А.А.

43. Операция «?» (знак вопроса)

• Синтаксис
<условие> ? <значение1> : <значение2>
• Если значение <условия> истинно (не равно 0),
то результат операции — <значение1>, иначе —
<значение2>
<значение1>
типа
• Примеры:
и <значение2> должны быть одного
int sign = (a >= 0) ? 1 : -1;
int b;
cin >> b;
cout << (b > 0 ? ">0" : (b == 0 ? "=0" :
"<0"));
НРТК, 2022 г. 43
Фундаментальные типы данных и операции
Созонов А.А.

44. Двоичный дополнительный код

Правило
для нахождения
модуля
отрицательного
числа,
представленного
в двоичном
дополнительном
коде, нужно
заменить все его
разряды на
обратные и
добавить 1
НРТК, 2022 г. 44
Фундаментальные типы данных и операции
Созонов А.А.

45. Примеры вычислений

• unsigned char pu = 100, qu = 200;
pu = 10010 = 011001002, qu = 20010 = 110010002
pu + qu = 001011002 = 32 + 8 + 4
= 4410
pu - qu = 100111002 = 128 + 16 + 8 + 4 = 15610
char z = 127;
z + 1 = -128
НРТК, 2022 г. 45
Фундаментальные типы данных и операции
Созонов А.А.

46. Примеры побитовых вычислений

• Установка единиц
• Установка нулей
• Изменение заданных
разрядов на
противоположные
• Инверсия всех
разрядов
x = 1100 0101
~x
равно 0011
НРТК, 2022 г. 46
1010
Фундаментальные типы данных и операции
Созонов А.А.

47. Сдвиги

• Сдвиг влево эквивалентен умножению на
степень 2
Пусть y равно 1100 01012
= –0011 10112 = –5910
y << 2 равно 1100 0101 << 2 = 0001 01002 = 2010
• Размножение знака при сдвиге вправо
y >> 2
равно 1100 0101 >> 2 =
signed char ii = 0305;
int i = ii >> 2;
unsigned char jj = 0305;
int j = jj >> 2;
//
//
//
//
ii
i
jj
j
=
=
=
=
1111 00012 =
-0000 11112 = -15
1100
1111
1100
0011
0101
0001
0101
0001
(-59)
(-15)
(-197)
(49)
Демонстрация
НРТК, 2022 г. 47
Фундаментальные типы данных и операции
Созонов А.А.

48. Задачи

• Работа с числовыми множествами
– программа поддерживает выполнение трех
теоретико-множественных операций:
• включение элемента в множество
• удаление элемента из множества
• проверку принадлежности элемента множеству
– количество элементов множества не превышает 32
– элемент множества задается его номером
• Вычисление количества ведущих нулей в слове
• Задачи для самостоятельной работы
НРТК, 2022 г. 48
Фундаментальные типы данных и операции
Созонов А.А.

49.

НРТК, 2022 г. 49
Фундаментальные типы данных и операции
Созонов А.А.
English     Русский Правила