Similar presentations:
Фундаментальные типы данных и операции. С / С++. Тема 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++ библиотека limitsnumeric_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Фундаментальные типы данных и операции
Созонов А.А.