Целочисленные выражения в языке IDL

Целочисленные выражения в языке IDL составляются из именованных целочисленных констант, целочисленных литералов, операторов (см. таблицу ниже) и группирующих круглых скобок.

Пример использования целочисленных выражений:

const UInt8 itemHeaderLen = 2;

const UInt8 itemBlockLen = 4;

const UInt8 maxItemCount = 0X10;

const UInt64 maxLen = (2 << 3) + (itemHeaderLen + itemBlockLen * 4) * maxItemCount;

interface {

CopyPage(in array<UInt8, 4 * maxLen> page);

}

Если при вычислении выражения возникнет целочисленное переполнение, генератор исходного кода, использующий IDL-файл, завершит работу с ошибкой.

Сведения об операторах целочисленных выражений в языке IDL

Синтаксис

Операция

Приоритет

Ассоциативность

Особенности

-a

Смена знака

1

Нет

Нет.

~a

Побитовое отрицание

1

Нет

Нет.

a ** b

Возведение в степень

2

Нет

Имеет следующие особенности:

  • Из-за отсутствия ассоциативности нужно использовать скобки при указании нескольких операторов подряд, чтобы задать порядок выполнения операций.

    Пример:

    (a ** b) ** c

    a ** (b ** c)

  • Показатель степени не должен быть отрицательным.

a * b

Умножение

3

Левая

Нет.

a / b

Целочисленное деление

3

Левая

Имеет следующие особенности:

  • Результатом операции является значение, полученное округлением вещественного результата деления до ближайшего меньшего целого. Например, 4 / 3 = 1, -4 / 3 = -2.
  • Делитель не должен быть нулевым.

a % b

Остаток от деления

3

Левая

Имеет следующие особенности:

  • Знак результата операции соответствует знаку делителя. Например, -5 % 2 = 1, 5 % -2 = -1.
  • Делитель не должен быть нулевым.

a + b

Сложение

4

Левая

Нет.

a - b

Вычитание

4

Левая

Нет.

a << b

Битовый сдвиг влево

2*

Нет

Имеет следующие особенности:

  • Приоритет ниже, чем у унарных операций, но несравним с приоритетами бинарных арифметических операций, поэтому в выражениях с бинарными арифметическими операциями нужно использовать скобки, чтобы задать порядок выполнения операций.

    Пример:

    a << (b + c)

    (a << b) ** c

  • Из-за отсутствия ассоциативности нужно использовать скобки при указании нескольких операторов подряд, чтобы задать порядок выполнения операций.

    Пример:

    (a << b) << c

    a << (b << c)

  • Значение сдвига должно быть в промежутке [0; 63].

a >> b

Битовый сдвиг вправо

2*

Нет

Имеет следующие особенности:

  • Приоритет ниже, чем у унарных операций, но несравним с приоритетами бинарных арифметических операций, поэтому в выражениях с бинарными арифметическими операциями нужно использовать скобки, чтобы задать порядок выполнения операций.

    Пример:

    a >> (b * c)

    (a >> b) / c

  • Из-за отсутствия ассоциативности нужно использовать скобки при указании нескольких операторов подряд, чтобы задать порядок выполнения операций.

    Пример:

    (a >> b) >> c

    a >> (b >> c)

  • Значение сдвига должно быть в промежутке [0; 63].

В начало