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только там, где это действительно нужно.