Почему здесь требуется явное приведение типов? - PullRequest
0 голосов
/ 21 июня 2019

Почему мы явно должны типизировать int к long long при умножении?

t=(long long)n*(long long)n дает правильный ответ, но t=n*n дает неправильный ответ:

#include <iostream>
using namespace std;

int main() {
int n=100000;
long long int t;
t=(long long)n*(long long)n;
//t=n*n  (This gives wrong answer)
printf("%lld",t);
return 0;
}

t=(long long)n*(long long)n дает 10000000000 в то время как t=n*n дает 1410065408 Почему это так?

1 Ответ

4 голосов
/ 21 июня 2019

Поскольку n является типом int, n * n также является типом int. В C ++ нет «динамического расширения».

Запись 1LL * n * n вызывает неявное преобразование типов n s в long long.

Наконец, обратите внимание, что даже 100000 может быть слишком большим для int - std::numeric_limits<int>::max() может быть столь же маленьким, как 32767. Если вы хотите, чтобы ваш код был portable вам нужно написать long n = 100000; и выражение для t как указано.

...