Integer Constants
Числа прямо в коде — 123, 0b1111011, 0x7B — это целочисленные константы; суффиксы U, L, UL позволяют явно задать их тип.
Полная статья
Описание
Когда вы пишете число прямо в коде — 123, 0b1111011, 0173 или 0x7B — это и есть целочисленная константа. Компилятор должен понять, к какому типу её отнести. По умолчанию большинство таких чисел трактуются как int, но если вам нужен другой тип, можно явно указать его с помощью суффиксов U, L или UL.
Помимо привычной десятичной записи, Arduino поддерживает двоичную, восьмеричную и шестнадцатеричную. Каждая из них удобна в своих ситуациях: при работе с битовыми масками, аппаратными регистрами или цветами.
| Основание | Пример | Запись | Комментарий |
|---|---|---|---|
| 10, десятичное | 123 | без префикса | обычная запись числа |
| 2, двоичное | 0b1111011 | префикс 0b | допустимы только 0 и 1 |
| 8, восьмеричное | 0173 | ведущий 0 | допустимы цифры от 0 до 7 |
| 16, шестнадцатеричное | 0x7B | префикс 0x | допустимы 0-9, A-F, a-f |
Десятичная запись
Обычные числа без какого-либо префикса — это десятичные константы. Именно так мы записываем числа в повседневной жизни, и именно так компилятор воспринимает их по умолчанию.
n = 101; // то же, что 101 в десятичной ((1 * 10^2) + (0 * 10^1) + 1)
Двоичная запись
Числа с префиксом 0b интерпретируются как двоичные. Такая запись особенно полезна, когда важно видеть состояние каждого отдельного бита — например, при настройке портов или составлении битовых масок. Сравните: 0b1111011 и 123 — одно и то же число, но первый вариант сразу показывает, какие биты установлены.
n = 0b101; // то же, что 5 в десятичной ((1 * 2^2) + (0 * 2^1) + 1)
Восьмеричная запись
Число, начинающееся с нуля, компилятор считает восьмеричным. Это частый источник ошибок: если вы напишете 0101, намереваясь обозначить сто один, то получите совсем другое значение. Будьте внимательны с ведущими нулями в числах — в Arduino-коде они меняют систему счисления, а не просто украшают запись.
n = 0101; // то же, что 65 в десятичной ((1 * 8^2) + (0 * 8^1) + 1)
Шестнадцатеричная запись
Шестнадцатеричные числа записываются с префиксом 0x. Эта форма стала стандартом для байтов, адресов, цветов и масок — там, где важно наглядно видеть группы по четыре бита. Например, {{#0x7B}} соответствует 123 в десятичной системе.
n = 0x101; // то же, что 257 в десятичной ((1 * 16^2) + (0 * 16^1) + 1)
Суффиксы U, L и UL
Компилятор сам выбирает тип для целочисленной константы, но иногда это приводит к неожиданному поведению — особенно при арифметике с большими числами или при сравнении значений разных типов. Суффиксы позволяют явно управлять этим:
Uилиu— задаёт беззнаковый целый тип, например33U;Lилиl— задаёт типlong, например100000L;ULилиul— задаёт типunsigned long, например32767UL.
Суффиксы можно писать в любом регистре, но строчные буквы (l, ul) лучше избегать: строчная l легко спутать с единицей.
Практические замечания
- Никогда не ставьте ведущий ноль перед числом, которое хотите записать в десятичной системе:
010— это уже восьмеричная запись, и её значение будет другим. - Двоичная запись делает битовые маски самодокументируемыми: сразу видно, какие биты включены, без мысленного перевода из десятичного числа.
- При работе с временными интервалами и функцией
millis()используйте суффиксUL: без него выражения вроде1000ULмогут переполниться ещё до присваивания, потому что компилятор вычислит их какint. - Шестнадцатеричная запись удобна для цветов в RGB-форматах и для адресов I²C-устройств — такие числа принято записывать именно так в даташитах.
- Если результат вычислений выглядит странно, проверьте типы операндов: смешение знаковых и беззнаковых значений — одна из самых частых причин трудноуловимых ошибок.