Перейти к содержимому
Теория · Переменные и типы · урок 1 из 9

Встроенные типы и их размеры

Чему вы научитесь

Чему вы научитесь:

  • выбирать тип переменной под данные: целое число, дробное, символ или «да/нет»;
  • задавать начальное значение так, чтобы компилятор ловил потерю части числа;
  • защищать значения от случайных изменений с помощью const и constexpr;
  • понимать, где видно имя переменной и сколько она живёт.
Открытая коробка count со штампом int и плиткой 3 внутри стоит на четырёх ячейках памяти

Представьте склад, где каждая вещь лежит в своей коробке. На коробке наклейка с именем, чтобы её найти, а сбоку штамп: что в ней можно хранить. Коробка для яиц не годится для молока, а большой предмет не влезет в узкую коробку.

В программе на C++ такая коробка называется переменной — это именованное место в памяти. Наклейка — имя переменной, штамп — её тип, а то, что лежит внутри, — значение. Тип задают при объявлении: он решает, какие значения переменная хранит и как они печатаются. Здесь true выводится как 1:

C++
#include <iostream>

int main() {
    int count = 3;
    double price = 2.5;
    char grade = 'A';
    bool ready = true;
    std::cout << count << ' ' << price << '\n';  // 3 2.5
    std::cout << grade << ' ' << ready << '\n';  // A 1
}

Разберём объявление int count = 3; по частям:

  • int — тип, штамп на коробке: внутри лежит целое число;
  • count — имя, наклейка на коробке;
  • 3 — начальное значение, то, что положили в коробку сразу.

Дальше в программе имя означает это значение: std::cout << count печатает 3. Тип переменной после объявления не меняется: штамп ставят один раз.

Здесь сравнение с коробкой перестаёт работать. Настоящая коробка бывает пустой, а переменная — нет: в ней всегда лежит какое-то значение, даже если вы его не положили, и такое значение непредсказуемо.

Основные типы

Четыре типа встречаются почти в каждой программе:

  • int — целое число: 42, -7, 0;
  • double — число с дробной частью: 2.5, -0.1;
  • char — один символ в одинарных кавычках: 'A', '7';
  • bool — логическое значение true или false: std::cout печатает их как 1 и 0.

Реже встречаются ещё четыре типа:

  • long long — целые числа, которые не помещаются в int;
  • float — дробные числа с меньшей точностью, чем у double;
  • short — целый тип не длиннее int;
  • long — целый тип не короче int.

Присваивание

Значение в коробке можно заменить. Для этого пишут имя переменной, знак = и новое значение — такая запись называется присваиванием:

  • count = 5; кладёт в уже объявленную переменную новое значение: тип остаётся прежним, а старое значение пропадает;
  • count = count + 1; сначала читает текущее значение count, прибавляет 1 и записывает результат обратно, поэтому 3 превращается в 4;
  • = внутри объявления, как в int count = 3;, задаёт первое значение, а = после объявления — это присваивание.

Знак = здесь не равенство из математики. Запись count = count + 1 читается так: «положить в count её значение плюс один».

Размер в байтах

Память компьютера похожа на длинный ряд пронумерованных ячеек. Одна ячейка — это байт, и в ней помещается одно из 256 значений. Коробка-переменная занимает несколько ячеек подряд: чем больше байт у типа, тем шире диапазон чисел, которые в него помещаются.

Каждый тип занимает в памяти своё число байт, и от этого числа зависит, какие значения поместятся в переменную. Размер показывает sizeof. Стандарт C++ точно задаёт только sizeof(char): он всегда равен 1. Остальные размеры зависят от платформы и компилятора:

C++
#include <iostream>

int main() {
    std::cout << sizeof(char) << ' ' << sizeof(int) << '\n';  // 1 4
    std::cout << sizeof(long long) << ' ' << sizeof(double) << '\n';  // 8 8
}

Так эта программа печатает на обычном компьютере и в задачах курса. В четыре байта int помещаются числа примерно до двух миллиардов, а для больших берут long long. На собеседовании часто спрашивают, сколько байт занимает int. Точный ответ: стандарт задаёт только нижнюю границу, а на обычных компьютерах это четыре байта.

Тип литерала

Литерал — значение, записанное прямо в коде. Его тип компилятор определяет по записи:

ЛитералТип
10int
2.5double
2.5ffloat
'a'char
truebool

Число с точкой — это double, даже без дробной части: 2.0 тоже double. Суффикс f делает литерал float: 2.5f — это float, а не double. Разницу видно по sizeof:

C++
std::cout << sizeof(2.5) << ' ' << sizeof(2.5f) << '\n';  // 8 4

Частая ошибка

Символ записан в двойных кавычках:

C++
char grade = "A";  // ✗
TEXT
error: cannot initialize a variable of type 'char' with an lvalue of type 'const char[2]'

Это ошибка компиляции. Двойные кавычки создают текст из любого числа символов, а char хранит ровно один символ. Один символ пишут в одинарных кавычках: 'A'.

Главное

  • Переменная — именованное место в памяти: у неё есть тип, имя и значение, а тип после объявления не меняется.
  • Основные типы — int, double, char и bool; сколько байт занимает тип, показывает sizeof.
  • count = count + 1; читает старое значение, прибавляет 1 и записывает результат обратно.
  • Символ пишут в одинарных кавычках, 'A', а число с точкой, даже 2.0, — это double.

Подпишись, чтобы пройти курс

Курс бесплатный. Войди через Telegram и подпишись на канал — откроются все уроки.

Войти другим способом