Re: Int overflow (простой вопрос)
От: Андрей Тарасевич Беларусь  
Дата: 16.12.06 22:36
Оценка: 63 (6)
Здравствуйте, Посторонним В., Вы писали:

ПВ>Пожалуйста объясните (со ссылкой на стандарт или авторитетов вроде Страуструпа) что должен напечатать след. код

ПВ>
ПВ>    short s = SHRT_MAX + 1;
ПВ>    int i = INT_MAX + 1;
ПВ>    cout << ++s << endl;
ПВ>    cout << ++i << endl;
ПВ>


У тебя тут слишком много свалено в кучу, чтобы понять, в чем именно состоит суть вопроса... Ну да ладно.

Сначала рассмотрим то, что связано с переменной 'i'. Тут все просто: в процессе инициализации 'i' производится вычисление выражения 'INT_MAX + 1'. Это выражение вычисляется в рамках типа 'int' и приводит к переполнению, т.к. значение 'INT_MAX + 1' не помещается в диапазон значений типа 'int'. Это приводит к неопределенному поведению (см. 5/5). Т.е. неопределенное поведение в этом случае возникает еще в процессе вычисления выражения 'INT_MAX + 1'. До инициализации собственно 'i' (и, тем более, до инкремента и печати 'i') дело даже может и не дойти. Рассматривать ситуацию с 'i' дальше смысла не имеет.

Теперь 's'. Сначала будет производитьcя вычисление выражения 'SHRT_MAX + 1' и делаться это будет в рамках типа 'int'. Тут возможны два варианта,
в зависимости от того, как соотносятся диапазоны значений типов 'short' и 'int'. Если вдруг окажется, что на данной платформе диапазон 'short' совпадает с диапазоном 'int', то 'SHRT_MAX' будет совпадать с 'INT_MAX', и результатом этого будет точно такое же неопределенное поведение, как и в случае с 'i'. Т.е. дальше гадать незачем.

Если же диапазон 'short' меньше диапазона 'int', то выражение 'SHRT_MAX + 1' будет вычислено успешно и его результат будет иметь тип 'int'. Затем полученным значением будет инициализироваться переменная 's'. Полученное значение не помещается в диапазон типа 'short', поэтому в процессе инициализации это значение будет преобразовано каким-то образом, определяемым реализацией (см. 4.7/3). (Подчеркну, что здесь нет неопределенного поведенеия, а есть поведение, определяемое реализацией.) Таким образом невозможно абстрактно сказать, какое значение получится в результате инициализации в 's'. В общем случае — любое.

Далее будет выполнена попытка инкрементировать значение 's'. '++s' эквивалентно 's = s + 1'. Если на предыдущем этапе значение 's' получилось меньше, чем 'SHRT_MAX', то оно будет просто мирно увеличено на 1. Если же в 's' было 'SHRT_MAX', то опять произойдет точно то же, что произошло на этапе инициализации (здесь му уже полагаем, что диапазон 'short' меньше диапазона 'int'), т.е. в 's' попадет какое-то значение, определяемое реализацией.

Таким образом, если рассматривать этот код как единое целое, то ответа на твой вопрос не существует потому, что этот код обязательно порождает неопределенное поведение (из-за 'INT_MAX + 1').

Если рассматривать 's' и 'i' неазависимо, то про 'i' опять говорить нечего, ибо неопределенное поведение.

А про 's' можно сказать, что все это либо приведет к неопределенному поведению, либо к печати некоего определяемого реализацией значения (т.е. в общем случае — любого).
Best regards,
Андрей Тарасевич
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.