Простой C вопрос - PullRequest
       1

Простой C вопрос

5 голосов
/ 22 ноября 2010

Я родился в современном мире, поэтому мне не часто приходится сталкиваться с подобными вещами, но кто-то может объяснить, как получить правильное число в следующем коде. Вот одна попытка многих:

#define     X   2527
#define     Y   2463
#define     Z   3072

main()
{
long int c = X*Y*Z;
printf("%ld",c);
}

Я просто пытаюсь напечатать длинное целое число, но оно всегда печатает неправильный результат. Получаю ли я целочисленные переполнения - если да, как я могу их предотвратить? Или это мой выбор для printf formatter?

Ответы [ 4 ]

8 голосов
/ 22 ноября 2010

Переполнение в порядке, потому что вы пытаетесь записать 34-битное число в 32-битную переменную (long int).

Используйте long long int и %lld в строке формата.

#define     X   2527LL
#define     Y   2463LL
#define     Z   3072LL

main()
{
long long int c = X*Y*Z;
printf("%lld",c);
}
3 голосов
/ 22 ноября 2010

Проблема в том, что константы не интерпретируются как длинные целые числа, а приведение к длинному целому происходит только после вычисления выражения. Вы можете привести их в выражение, чтобы решить это, или просто определить их как длинные константы. Кроме того, long может не хватить, вместо этого следует использовать long long, если он поддерживается.

1 голос
/ 22 ноября 2010

Да, вы получаете переполнение.Ответ не будет вписываться в 32-битное целое число со знаком, которым является длинное int.Вы должны использовать 64-битный тип, то есть long long.

Кроме того, вы должны выполнять приведение типов, в противном случае промежуточный расчет будет переполнен.

#define     X   2527
#define     Y   2463
#define     Z   3072

main()
{
long long c = (long long)X*Y*Z;
printf("%lld",c);
}
0 голосов
/ 11 февраля 2011
#define     X   2527.0
#define     Y   2463
#define     Z   3072

main()
{
double c = X*Y*Z;
printf("%lf",c);
}

Вы также можете использовать двойной.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...