Главная chevron_right Переменные и константы chevron_right Константы chevron_right Integer Constants

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-устройств — такие числа принято записывать именно так в даташитах.
  • Если результат вычислений выглядит странно, проверьте типы операндов: смешение знаковых и беззнаковых значений — одна из самых частых причин трудноуловимых ошибок.

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