Целочисленные выражения в языке 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].
|
В начало
[Topic ice_idl_int_expres]