Составители:
Рубрика:
• Преобразование значения с плавающей запятой к типу float32
может вызывать потерю точности. Кроме того, если это значе-
ние слишком велико для float32, то результатом преобразова-
ния является +inf или -inf.
• Инструкция conv.r.un интерпретирует целое значение, лежащее
на вершине стека, как не имеющее знака и преобразует его к ве-
щественному типу (либо float32, либо float64 в зависимости от
значения).
• Если переполнение возникает при преобразовании значения
одного целого типа к другому целому типу, то обрезаются стар-
шие биты значения.
В таблице 3.16 приведены инструкции для преобразования значений,
имеющих знак, к целым типам с контролем переполнения. В случае воз-
никновения переполнения эти инструкции генерируют исключение
OverflowException.
Инструкции, представленные в таблице 3.17, используются для пре-
образования беззнаковых значений к нужному типу и генерируют исклю-
чение OverflowException в случае переполнения.
Common Intermediate Language
99
3.2.2.2. Унарные арифметические операции
В таблице 3.13 приведены две инструкции, выполняющие унарные
арифметические операции. Диаграмма стека для унарных операций вы-
глядит следующим образом:
... , value -> ... , result
Инструкция neg применима как для целых чисел, так и для чисел с
плавающей запятой и обладает двумя особенностями:
• Результатом применения этой инструкции к наименьшему от-
рицательному целому числу (такое число не имеет «парного»
положительного числа) является само это наименьшее отрица-
тельное число. Для того чтобы иметь возможность перехватить
эту ситуацию, необходимо вместо инструкции neg использовать
sub.ovf.
• Результатом применения этой инструкции к NaN является NaN.
3.2.2.3. Инструкция ckfinite
Инструкция ckfinite (см. таблицу 3.14) генерирует исключение
ArithmeticException, если число с плавающей запятой, находящееся на
вершине стека вычислений, равно NaN, +inf или -inf. Если исключение
не генерируется, то стек вычислений не меняется, поэтому диаграмма сте-
ка выглядит следующим образом:
... , value -> ... , value
Таблица 3.14. Инструкция ckfinite
3.2.2.4. Преобразование значений
Инструкции преобразования значений потребляют один операнд со
стека вычислений и преобразуют его к нужному типу. Диаграмма стека для
этих инструкций выглядит следующим образом:
... , value -> ... , result
Базовые инструкции преобразования представлены в таблице 3.15.
Они обладают следующими особенностями:
• Преобразование чисел с плавающей запятой к целому типу обре-
зает дробную часть числа. Если при этом возникает переполнение,
то возвращаемый результат неопределен (зависит от реализации).
98
CIL и системное программирование в Microsoft .NET
Код Инструкция Встроенный Описание
операнд
0xC3 ckfinite –Проверка того, что число с пла-
вающей запятой является ко-
нечным
Код Инструкция Встроенный Описание
операнд
0x67 conv.i1 – Преобразовать к int8
0x68 conv.i2 – Преобразовать к int16
0x69 conv.i4 – Преобразовать к int32
0x6A conv.i8 – Преобразовать к int64
0x6B conv.r4 – Преобразовать к float32
0x6C conv.r8 – Преобразовать к float64
0x6D conv.u4 – Преобразовать к unsigned int32
0x6E conv.u8 – Преобразовать к unsigned int64
0x76 conv.r.un – Преобразовать беззнаковое це-
лое число в число с плавающей
запятой
0xD1 conv.u2 – Преобразовать к unsigned int16
0xD2 conv.u1 – Преобразовать к unsigned int8
0xD3 conv.i – Преобразовать к native int
0xE0 conv.u – Преобразовать к unsigned native int
Таблица 3.15. Преобразование значений без контроля переполнения.
98 CIL и системное программирование в Microsoft .NET Common Intermediate Language 99
3.2.2.2. Унарные арифметические операции Таблица 3.15. Преобразование значений без контроля переполнения.
В таблице 3.13 приведены две инструкции, выполняющие унарные
Код Инструкция Встроенный Описание
арифметические операции. Диаграмма стека для унарных операций вы-
глядит следующим образом: операнд
... , value -> ... , result 0x67 conv.i1 – Преобразовать к int8
Инструкция neg применима как для целых чисел, так и для чисел с 0x68 conv.i2 – Преобразовать к int16
плавающей запятой и обладает двумя особенностями: 0x69 conv.i4 – Преобразовать к int32
• Результатом применения этой инструкции к наименьшему от- 0x6A conv.i8 – Преобразовать к int64
рицательному целому числу (такое число не имеет «парного»
0x6B conv.r4 – Преобразовать к float32
положительного числа) является само это наименьшее отрица-
тельное число. Для того чтобы иметь возможность перехватить 0x6C conv.r8 – Преобразовать к float64
эту ситуацию, необходимо вместо инструкции neg использовать 0x6D conv.u4 – Преобразовать к unsigned int32
sub.ovf. 0x6E conv.u8 – Преобразовать к unsigned int64
• Результатом применения этой инструкции к NaN является NaN. 0x76 conv.r.un – Преобразовать беззнаковое це-
лое число в число с плавающей
3.2.2.3. Инструкция ckfinite
запятой
Инструкция ckfinite (см. таблицу 3.14) генерирует исключение
ArithmeticException, если число с плавающей запятой, находящееся на 0xD1 conv.u2 – Преобразовать к unsigned int16
вершине стека вычислений, равно NaN, +inf или -inf. Если исключение 0xD2 conv.u1 – Преобразовать к unsigned int8
не генерируется, то стек вычислений не меняется, поэтому диаграмма сте- 0xD3 conv.i – Преобразовать к native int
ка выглядит следующим образом: 0xE0 conv.u – Преобразовать к unsigned native int
... , value -> ... , value
Таблица 3.14. Инструкция ckfinite • Преобразование значения с плавающей запятой к типу float32
может вызывать потерю точности. Кроме того, если это значе-
Код Инструкция Встроенный Описание ние слишком велико для float32, то результатом преобразова-
операнд ния является +inf или -inf.
0xC3 ckfinite – Проверка того, что число с пла- • Инструкция conv.r.un интерпретирует целое значение, лежащее
вающей запятой является ко- на вершине стека, как не имеющее знака и преобразует его к ве-
щественному типу (либо float32, либо float64 в зависимости от
нечным
значения).
• Если переполнение возникает при преобразовании значения
3.2.2.4. Преобразование значений одного целого типа к другому целому типу, то обрезаются стар-
Инструкции преобразования значений потребляют один операнд со шие биты значения.
стека вычислений и преобразуют его к нужному типу. Диаграмма стека для В таблице 3.16 приведены инструкции для преобразования значений,
этих инструкций выглядит следующим образом: имеющих знак, к целым типам с контролем переполнения. В случае воз-
... , value -> ... , result никновения переполнения эти инструкции генерируют исключение
Базовые инструкции преобразования представлены в таблице 3.15. OverflowException.
Они обладают следующими особенностями: Инструкции, представленные в таблице 3.17, используются для пре-
• Преобразование чисел с плавающей запятой к целому типу обре- образования беззнаковых значений к нужному типу и генерируют исклю-
зает дробную часть числа. Если при этом возникает переполнение, чение OverflowException в случае переполнения.
то возвращаемый результат неопределен (зависит от реализации).
Страницы
- « первая
- ‹ предыдущая
- …
- 54
- 55
- 56
- 57
- 58
- …
- следующая ›
- последняя »
