long

Тип long хранит 32-битные целые числа со знаком (от −2 147 483 648 до 2 147 483 647) — выручает, когда int не хватает для счётчиков или временных меток.

Полная статья

Описание

Тип long — это 32-битное целое число со знаком. Он занимает 4 байта памяти и позволяет хранить значения от -2 147 483 648 до 2 147 483 647. Используйте long, когда стандартного типа int (16 бит на большинстве плат AVR) не хватает — например, при работе с большими счётчиками, временными метками или результатами перемножения нескольких чисел.

Арифметика с типом long

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

  • Добавить суффикс L к целочисленному литералу: например, 100000L.
  • Использовать переменную типа long в выражении.

Подробнее о правилах смешанной арифметики читайте на целочисленные константы странице.

Синтаксис

long var = val;

Параметры

  • var: имя переменной.
  • val: начальное значение, присваиваемое переменной. Должно укладываться в диапазон типа long.

Пример кода

    long speedOfLight_km_s = 300000L;  // см. страницу целочисленных констант для объяснения суффикса 'L'

Где применяется

  • Измерение времени — функция millis() возвращает unsigned long, а промежуточные вычисления с временными метками часто требуют long.
  • Счётчики импульсов — если устройство работает долго, счётчик на int быстро переполнится; long даёт запас более чем в 2 миллиарда единиц.
  • Перемножение больших чисел — произведение двух int-значений легко выходит за 32 767, и без явного приведения к long результат окажется неверным.
  • Работа с координатами и расстояниями — в задачах навигации или одометрии числа быстро превышают диапазон int.

Практические замечания

  • На платах с 32-битным процессором (Arduino Due, ESP32 и др.) тип int уже занимает 4 байта, поэтому его диапазон совпадает с long. Тем не менее явное использование long делает код переносимым.
  • Если результат всегда неотрицательный, рассмотрите unsigned long — он вдвое расширяет верхнюю границу (до 4 294 967 295).
  • При смешивании long и float в одном выражении результат будет float. Следите за потерей точности при обратном приведении к long.
  • Константы без суффикса L, превышающие 32 767, компилятор может интерпретировать неожиданно на 8-битных платах — всегда добавляйте L к большим литералам.
  • Переменная long занимает в четыре раза больше памяти, чем int на AVR-платах. В ресурсоёмких проектах с ограниченным ОЗУ используйте long только там, где это действительно нужно.

Полезные материалы