Size: a a a

Compiler Development

2019 September 28

Dv

Dr. Friedrich von Never in Compiler Development
EgorBo
зависит, если контекст обернут в checked { } где либо то x * 2 / 2 может рвануть исключением.
если не обернут, то все равно x * 2 / 2 где х >= int.MaxValue/2 — это будут неэквивалентные числа
А я всё равно не понял, в чём тут будет неэквивалентность
источник

Dv

Dr. Friedrich von Never in Compiler Development
В рантайме же то же самое посчитается?
источник

Dv

Dr. Friedrich von Never in Compiler Development
В чём разница между рантаймом и компилтаймом?
источник

Dv

Dr. Friedrich von Never in Compiler Development
Если только про unchecked говорить.
источник

E

EgorBo in Compiler Development
Dr. Friedrich von Never
А я всё равно не понял, в чём тут будет неэквивалентность
введи у себя в консоли
источник

E

EgorBo in Compiler Development
int x = 1_500_000_000;
int y = x * 2 / 2;
Console.WriteLine($"{x} == {y}");
источник

Dv

Dr. Friedrich von Never in Compiler Development
Эм
источник

Dv

Dr. Friedrich von Never in Compiler Development
Ну, во-первых, тут нету констант
источник

E

EgorBo in Compiler Development
всмысле нет
источник

E

EgorBo in Compiler Development
* 2 / 2
источник

Dv

Dr. Friedrich von Never in Compiler Development
А, ну и что? Я не понимаю всё ещё
источник

E

EgorBo in Compiler Development
числа x и y — равны?
источник

Dv

Dr. Friedrich von Never in Compiler Development
Или ты хотел эту часть свернуть в компилтайме, и оставить int y = x?
источник

Dv

Dr. Friedrich von Never in Compiler Development
Тогда правильно завернули, ишь чего удумал :)
источник

M

MaxGraey in Compiler Development
EgorBo
y = x * 2 / 2;
И правильно что отклонили, LLVM кстати и с плавающей арифметикой устраивает вакханалию, да такую что потом внутренние тесты WebAssembly не проходят. Например x * -1.0 не должен оптимизироваться в -x
источник

E

EgorBo in Compiler Development
Dr. Friedrich von Never
Или ты хотел эту часть свернуть в компилтайме, и оставить int y = x?
C++ компиляторы так делают
источник

Dv

Dr. Friedrich von Never in Compiler Development
EgorBo
C++ компиляторы так делают
Они нам не указ.
источник

Dv

Dr. Friedrich von Never in Compiler Development
У этого кода есть только один вариант валидного поведения, у нас же оверфлоу в спеке прописан
источник

Dv

Dr. Friedrich von Never in Compiler Development
В C++, кажется, оверфлоу — это UB, так что плюсокомпиляторы в своей области применения правы.
источник

E

EgorBo in Compiler Development
ну зато x + 2 - 2 работает :D
источник