Математическая сумма этих трех чисел больше, чем 2 32 , и вы используете unsigned long
, который 32-разрядный в Windows (даже если вы компилируете свою программу с 64-битными указателями -- это преднамеренное нарушение C89 со стороны Microsoft), поэтому стандарты C и C ++ указывают, что он оборачивается.Полученное число: 1124073472 + 2835349503 + 2533359615 - 2 32 .
Если вы используете 64-битный тип, вам нужно изменить спецификатор формата printf
, чтобы он соответствовал.Этот код даст математически ожидаемый ответ в системе, совместимой с C99:
#include <stdio.h>
int main(void)
{
unsigned long long total = 1124073472 + 2835349503;
total += 2533359615;
printf("Total: %llu\n", total);
return 0;
}
Однако ни одна версия MSVC не совместима с C99.Я не знаю подходящего объявления типа или спецификатора формата printf
для MSVC.
Дополнения: 1) Добавление не определено, чтобы обернуться при переполнении для подписанных типов;это неопределенное поведение.Это чаще всего кусает людей, которые используют индексы со знаком цикла, когда ограничение цикла зависит от данных.2) Если бы вы занимались математикой с числами, которые потенциально могли бы быть больше, чем 2 64 , даже long long
не спасло бы вас.C и (насколько я знаю) C ++ не имеют настоящих типов "bignum";вам понадобится сторонняя библиотека.