Здравствуйте, Don Reba, Вы писали:
N>>Не должно быть никакого "что угодно". Должно быть примерно следующее (и это должно быть в стандарте): в случае, если результат не помещается в целевой тип целого со знаком, компилятор и среда исполнения могут, по выбору: N>>• выполнить операцию в соответствии с правилами платформы N>>• выполнить операцию в соответствии с общепринятой арифметикой в дополнительном коде N>>• выполнить операцию, отдав в качестве результата зависящее от реализации значение N>>• по зависящим от реализации правилам выполнить действие, предусмотренное для особой ситуации типа "целочисленное переполнение" DR>Предположение, что переполнения быть не может в принципе позволяет комиляютору соптимизировать выражение x * 2 / 2. А ограничения выше — нет.
Это решается банально, если в выражениях следить за доменами возможных значений параметров. При этом x*2 может, в зависимости от того, откуда взялось, иметь разную семантику. Если это x*2 от пользователя, то оно само по себе уже типа int. Если же оно возникло от индексации массива short'ов, то оно является чем-то вроде int33_t.
Для компилятора уровня gcc следить за такими вещами тривиально — он и в значительно более сложных материях много гитик.