long()
long(x) явно преобразует значение к 32-битному знаковому целому — незаменимо, когда диапазона int не хватает для больших счётчиков или умножения.
Полная статья
Описание
long() явно преобразует значение к типу long — 32-битному знаковому целому. Это полезно, когда диапазон int (от −32 768 до 32 767) слишком мал: например, при работе с миллисекундами, большими счётчиками или результатами умножения нескольких int-значений.
Синтаксис
long(x)(long) x
Оба варианта равнозначны: первый — классический C-стиль приведения типов, второй — функциональный стиль Arduino.
Параметры
x: значение любого типа — целое, дробное или символ. Если передать float или double, дробная часть будет отброшена без округления.
Возвращает
Значение типа long — знаковое 32-битное целое в диапазоне от −2 147 483 648 до 2 147 483 647.
Где применяется
- Умножение двух
int-переменных, когда результат может выйти за пределы 16-битного диапазона. - Вычисления с
millis()илиmicros(), которые сами возвращаютunsigned long, но участвуют в знаковой арифметике. - Передача значения в функцию, ожидающую
long-аргумент, без неявных преобразований. - Промежуточные вычисления в формулах, где важно избежать переполнения на ранних этапах.
Практические замечания
- Приводите операнды к
longдо выполнения операции, а не после: если написатьlong result = a * b, гдеaиb—int, умножение всё равно произойдёт в 16-битном диапазоне и переполнится раньше, чем результат будет сохранён. Правильно:long result = (long)a * b. - Преобразование
float→longотбрасывает дробную часть:long(3.9)даст3, а не4. Если нужно округление, используйтеround()перед приведением. - Если отрицательные значения не нужны и важен расширенный положительный диапазон (до ~4 млрд), рассмотрите
unsigned long. - При выводе через
Serial.print()значенияlongотображаются корректно без дополнительных преобразований. - Явное приведение типов делает намерения в коде очевидными и помогает избежать трудно уловимых ошибок при портировании скетча на платы с разной разрядностью
int.