Выдает, только если вы находитесь в пределах проверенного контекста, либо в источнике, либо в качестве параметра в проекте (это зависит от языка). В результате мы получаем другую инструкцию IL.
Это всего лишь конкретный пример общей проблемы арифметического переполнения , и реализация JIT x86, несомненно, вставит проверку соответствующих флагов после любой такой операции с инструкцией для выдачи исключения, если флаги установлены.
инструкции (используя в качестве примера дополнение):
- добавление для добавления двух чисел (с переносом вокруг переполнения)
- add.ovf для добавления двух чисел и переполнения со знаком trap
- add.ovf.un , чтобы добавить два числа и перехватить переполнение без знака
Действительно, существует определенный уровень проверки компилятором, когда происходит постоянное сворачивание, и результирующее значение должно помещаться в назначенную переменную. Возможны другие меры статического анализа, но существуют ограничения на то, что можно поймать в ловушку.
Если вы хотите увидеть испущенный код JIT, просто отладьте соответствующий код в смешанном режиме и посмотрите на разборку, стек, регистры, как в обычной программе. Или же посмотрите и посмотрите на изображения ngen (это сложно, так как формат подвержен изменениям).
Обратите внимание, что при выполнении этого через VS вы можете запустить программу как обычно (в режиме Release), а затем подключить отладчик, поскольку результат JIT отличается в зависимости от того, подключен ли отладчик и помечена ли сборка. как запрещающие оптимизации (по умолчанию для отладочных сборок)