собственно говоря, и ваш (или не ваш) первоначальный код во всем соответствует спецификации Си, проблема лишь в том, понимаете ли вы сами эти спецификацииaam писал(а):ARV, такой код соответствует спецификации языка Си? И что будет генерить "правильный" компилятор по такому сишнику?
ваш вариант с UL - вполне правильное и нормальное решение проблемы - подробности вам уже рассказали. добавлю лишь, что для сохранения правильности вычислений достаточно, чтобы в цепочке одноприоритетных оперций суффикс UL был только у одной константы - остальные приведутся к этому типу автоматически. т.е. вместо 2000UL*3000UL достаточно писать 2000UL * 3000; но это мелочи
кстати, та же песня и при вычислениях с использованием переменных. часто можно видеть что-то типа
Код: Выделить всё
int x,y,z;
int var = (long)(x * y + z); это совершенно бессмысленная попытка добиться отсутствия переполнений - если в скобках все переменные типа int, то и результат будет не более int, и превращение его потом в long никак не изменить результат... правильно поступать так:
Код: Выделить всё
int x,y,z;
int var = (long)x * y + z;