Арифметические и битовые операции

Материал из Compilers Wiki
Версия от 16:57, 16 марта 2018; Admin (обсуждение | вклад) (Новая страница: « add, sub, div, mul -- T(T,T) udiv, rem, urem -- I(I,I) or, xor, and -- I(I,I) sar, shr, shl -- I(I,ww) Бвзовые арифметические инстр…»)
(разн.) ← Предыдущая | Текущая версия (разн.) | Следующая → (разн.)
Перейти к: навигация, поиск
add, sub, div, mul -- T(T,T)
udiv, rem, urem -- I(I,I)
or, xor, and -- I(I,I)
sar, shr, shl -- I(I,ww)

Бвзовые арифметические инструкции, в первую очередь, доступны для всех типов, целых чисел и чисел с плавающей точкой.

The base arithmetic instructions in the first bullet are available for all types, integers and floating points.

Когда div используется с возвращаемым типом w (word) или l (long), аргументы обрабатываются как знаковые. Беззнаковое целочисленное деление доступно как команда udiv. Когда результат деления не является целым числом, он усекается к нулю.

When div is used with word or long return type, the arguments are treated as signed. The unsigned integral division is available as udiv instruction. When the result of a division is not an integer, it is truncated towards zero.

Знаковые и беззнаковые операции остатка доступны как rem и urem. Знак остатка такой же, как и знак делимого. Его величина меньше делителя. Эти две команды и udiv доступны к использованию только с целыми аргументами и результатом.

The signed and unsigned remainder operations are available as rem and urem. The sign of the remainder is the same as the one of the dividend. Its magnitude is smaller than the divisor one. These two instructions and udiv are only available with integer arguments and result.

Побитовые операции OR, AND и XOR реализованы для обоих целочисленных типов. Логические операции, свойственные любому языку программирования, могут быть задействованы в Сранениях и Переходах.

Bitwise OR, AND, and XOR operations are available for both integer types. Logical operations of typical programming languages can be implemented using Comparisons and Jumps.

Инструкции сдвига sar, shr и shl, сдвигают вправо или влево свой первый операнд на значение из второго операнда. Значение сдвига берется по модулю и имеет такую же размерность, что и тип возвращаемого значения. Смещением вправо можно либо сохранить знак значения (используя sar), либо заполнить освобожденные биты нулями (используя shr). Сдвиг влево всегда заполняет освобожденные биты нулями.

Shift instructions sar, shr, and shl, shift right or left their first operand by the amount from the second operand. The shifting amount is taken modulo the size of the result type. Shifting right can either preserve the sign of the value (using sar), or fill the newly freed bits with zeroes (using shr). Shifting left always fills the freed bits with zeroes.

Стоит отметить, что арифметический сдвиг вправо (sar) эквивалентен только делению на степень двойки для неотрицательных чисел. Это связано с тем, что сдвиг вправо «усекает» к минус бесконечности, а деление усекает к нулю.

Remark that an arithmetic shift right (sar) is only equivalent to a division by a power of two for non-negative numbers. This is because the shift right "truncates" towards minus infinity, while the division truncates towards zero.



Источник: c9x.me