Почему получается разный результат:
__int64 f1()
{
return 24 * 60 * 60 * 1000 * 1000;
}
__int64 f2()
{
__int64 value = 24 * 60 * 60 * 1000;
return value * 1000;
}
int main()
{
__int64 value1 = f1(); //500654080
__int64 value2 = f2(); //86400000000
}
Ответ
Целочисленный литерал вроде 1000, 64 и т.п. имеет тип int и выражение с умножением этих чисел тоже имеет тип int. Итоговое значение не помещается в целовой тип (происходит переполнение, формально UB) и вы видите искаженные результаты. При сохранении промежуточного значения в более широкий тип, результат последующего умножения также будет иметь более широкий тип, который способен содержать итоговое произведение правильно.
Чтобы заработал первый вариант, достаточно добавить к одному из литералов суффикс ll, таким образом превратив литерал из типа int в тип long long int
Комментариев нет:
Отправить комментарий