зачем использовать int error, но long long right - PullRequest
3 голосов
/ 21 мая 2011
int c;
long long sum=0;
sum+=c*(c-1)/2;

когда с = 100000, почему сумма не может получить правильный ответ?я должен написать сумму + = (длинный длинный) (с * (с-1) / 2);

Ответы [ 3 ]

5 голосов
/ 21 мая 2011

int здесь я предполагаю, что это 32-битное значение - 100000 в квадрате (10E9) превышает максимальный диапазон для int, что приводит к переполнению.Будет работать приведенное ниже - приведение первого экземпляра c к long long будет означать, что остальная часть выражения будет «long long compatibility».

sum+=((long long)c*(c-1)/2);
1 голос
/ 21 мая 2011

В вашем вопросе c объявлен как целое число.поэтому он пересекает предел целого числа в выражении c * (c-1).поэтому происходит переполнение. прежде чем оно неявно преобразуется в long long. Вот причина UB.

, тогда как когда вы неявно преобразуете его в long long, вы получите правильный ответ ...

1 голос
/ 21 мая 2011

Поскольку он использует c в качестве int в вычислениях и расширяет его при сохранении.

Перед умножением вам нужно наложить одну из c на long long.

Кроме того, я предлагаю вам использовать int64_t вместо long long, чтобы вы могли получить нужный вам тип / размер независимо от того, что (см. stdint.h для различных идентификаторов ).

...