530.93K
AI
Category: programmingprogramming

С++типы данных

1.

ЛЕКЦИЯ
Типы данных в языке C++
Типы данных и их длина во внутреннем представлении.
Простые типы. Описание целых данных
0
1
'C' = 67
0
0
0
0
1
1
0
0
'+' = 43
1
0
1
0
1
1
0
0
'+' = 43
1
0
1
0
1
1

2.

План лекции
1
Понятие типа данных
4
Простые типы
2
Классификация типов
5
Описание целых данных
3
Представление в памяти
и длина
6
Переполнение и
рекомендации
2

3.

Что определяет тип данных?
Размер
Диапазон
Операции
Сколько байтов
переменная занимает в
памяти
Минимальное и
максимальное допустимое
значение
Какие операции
разрешены (например, %
только для целых)
int age = 18;
// целое число
double price = 1250.5; // вещественное
char grade = 'A';
// символ
bool passed = true;
// логическое
C++ – язык со статической типизацией:
тип переменной известен при
компиляции и не меняется.
3

4.

Классификация типов в C++
Типы данных
Фундаментальные (простые)
Составные (производные)
Целые: short, int, long, long long
Массивы
Символьные: char, wchar_t
Указатели и ссылки
Вещественные: float, double, long double
Структуры (struct) и классы
Логический: bool
Перечисления (enum)
Пустой: void
4

5.

Бит и байт
1 бит – значение 0 или 1. 8 бит = 1 байт.
0
1
0
0
0
0
0
1
7
6
5
4
3
2
1
0
1 байт = 8 бит
01000001₂ = 65 = 'A'
номер бита
С помощью n битов можно записать 2ⁿ значений:
256
65 536
4,29 млрд
1 байт (8 бит)
2 байта (16 бит)
4 байта (32 бита)
5

6.

Операция sizeof: размеры типов
sizeof(тип) возвращает размер типа в памяти в байтах.
Размер, байт (64-разрядный Linux, g++)
18
16
16
#include <iostream>
using namespace std;
14
12
10
8
8
6
4
4
2
0
8
1
1
bool
char
int main() {
cout << sizeof(int);
// 4
cout << sizeof(long long);
// 8
cout << sizeof(double);
// 8
}
8
4
2
short
int
long
long
long
float
double
long
double
6

7.

Размеры и диапазоны целых типов
Тип
Байт
Диапазон значений
char
1
−128 … 127 (или 0 … 255)
unsigned char
1
0 … 255
short
2
−32 768 … 32 767
unsigned short
2
0 … 65 535
int
4
−2 147 483 648 … 2 147 483 647
unsigned int
4
0 … 4 294 967 295
long
4 или 8
как int или как long long
long long
8
−9,22·10¹⁸ … 9,22·10¹⁸
unsigned long long
8
0 … 1,84·10¹⁹
7

8.

Стандарт фиксирует порядок, а не точный размер
1 = char
≤
short
≤
int
≤
long
≤
long long
sizeof(...)
Поэтому размеры зависят от системы:
Тип
Windows (Visual
Studio)
Linux 64 бит (g++)
int
4
4
long
4
8
long double
8
16
wchar_t
2
4
Если размер важен –
используйте sizeof, а не
заучивайте числа.
8

9.

Простые (фундаментальные) типы
123
.5
Целые
A
Символьный
int, short, long, long long
char
Числа без дробной части: счётчики,
индексы
Однобайтовый целый тип: хранит ASCII-код
символа ('A' = 65)
Вещественные
?
Логический
float, double
bool
Плавающая точка (IEEE 754): знак, порядок,
мантисса. Обычно double
Только true (1) и false (0); результат
сравнения
void – «отсутствие значения»: для функций, которые ничего не возвращают
9

10.

Модификаторы целых типов
signed
Знаковый: положительные и отрицательные (по умолчанию)
unsigned
Беззнаковый: только 0 и положительные
short
Короткий: обычно 2 байта
long / long long
Длинный: 4–8 байт / 8 байт
Слово int можно опускать – эти записи эквивалентны:
short a;
unsigned b;
long long c;
// short int a; signed short int a;
// unsigned int b;
// long long int c;
10

11.

Внутреннее представление целых чисел
Беззнаковые (unsigned)
Дополнительный код числа −5 (8 бит)
0 … 2ⁿ − 1
Записать +5 в двоичном виде
Чистый двоичный код
0
Знаковые (signed)
0
0
0
0
1
0
1
1
0
1
0
1
0
1
1
Инвертировать все биты
−2ⁿ⁻¹ … 2ⁿ⁻¹ − 1
1
1
1
1
Дополнительный код, старший бит – знак
Прибавить 1 → −5
1
1
1
1
Проверка: 11111011 как беззнаковое = 251 =
256 − 5
8 бит: unsigned 0 … 255,
signed −128 … 127
11

12.

Целые литералы
Запись
Система счисления
Число 255
без префикса
десятичная
255
0
восьмеричная
0377
0x
шестнадцатеричная
0xFF
двоичная
0b11111111
0b (C++14)
Суффиксы
u
unsigned
l
long
ll
long long
ull
unsigned long long
int d = 255, o = 0377, h = 0xFF, b = 0b11111111; // 255 255 255 255
unsigned int u = 4000000000u;
long long big = 9'000'000'000LL;
// Разделитель (C++14)
12

13.

Библиотеки <climits> и <cstdint>
<climits> – граничные значения
<cstdint> – типы точного размера
Не заучивайте числа – используйте готовые
константы
Одинаковый размер в любой системе
INT_MIN
INT_MAX
UINT_MAX
SHRT_MAX
LLONG_MAX
-2147483648
2147483647
4294967295
32767
9223372036854775807
int8_t, uint8_t – 8 бит
int16_t, uint16_t – 16 бит
int32_t, uint32_t – 32 бита
int64_t, uint64_t – 64 бита
#include <cstdint>
int32_t x = 42; // 32 бит
13

14.

Переполнение
1
1
1
1
1
1
1
1
+ 1
→
0
0
0
0
0
0
0
0
255 + 1 = 0
unsigned: результат «проворачивается» по модулю 2ⁿ
signed: неопределённое поведение (undefined behavior) – на результат полагаться нельзя
Частая ошибка
int x = 100000, y = 100000;
long long p = x * y;
// ошибка: переполнение
long long q = (long long)x * y; // правильно
Результат программы:
p = 1410065408
q = 10000000000
14

15.

Рекомендации по выбору типа
int
Целый тип по умолчанию
long long
Если значение может превысить 2·10⁹
size_t / unsigned
Для размеров и количеств (не смешивать со знаковыми)
double
Для вещественных чисел вместо float
<cstdint>
Для данных точного размера
15

16.

Контрольные вопросы
1
Что определяет тип данных?
2
Для чего используется операция sizeof?
3
Почему размер long различается в Windows
и Linux?
4
В чём разница между signed и unsigned?
5
Запишите 8-битный дополнительный код
числа −12.
6
Десятичные значения литералов 0x1F, 017,
0b1010?
Спасибо за внимание!
English     Русский Rules