Умножение int в С++ с длинным длинным результатом

Я пытаюсь найти квадрат int. Мой код выглядит следующим образом:

long long sqr=0;
int num=77778;
sqr= num*num;

Результат должен был быть 6049417284 Но когда я проверяю вывод, он показывает 1754449988. Какую ошибку я делаю? long long должен иметь возможность сохранить результат, но почему я получаю другое значение?


person srip    schedule 10.06.2016    source источник
comment
Сначала num*num дает целое число (и переполнение), которое затем неявно приводится к типу long long.   -  person Stanley F.    schedule 10.06.2016


Ответы (2)


В этом случае тип промежуточного результата совпадает с типом первого аргумента. Таким образом, этот код помещает неправильное значение в sqr (потому что здесь у вас целочисленное переполнение). Попробуй это:

long long num = 77778;
long long sqr = num * num;

Другой способ с кастингом:

int num = 77778;
long long sqr = (long long) num * num;

Чтобы понять это лучше, вы можете проверить эти строки:

int ia = 1, ib = 2;
double da = 1.0, db = 2.0;
double ic = ia / ib; // c == 0.0, because intermediate result of division is 0
double dc = da / db; // c == 0.5, expected result
person Ilya    schedule 10.06.2016
comment
Я пытаюсь понять ошибку в моем коде. Разве результат не должен правильно храниться с моим кодом? - person srip; 10.06.2016
comment
@rowang Промежуточный результат перед сохранением совпадает с типами аргументов. - person Richard Critten; 10.06.2016

Если вы умножите два целых числа, результатом будет целое число. Тогда присвоение целочисленного значения long long бессмысленно.

Таким образом, чтобы получить желаемый результат, число также должно быть длинным.

person Monirul Islam Milon    schedule 10.06.2016