2010-11-22 2 views
4

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

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

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

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

ответ

7

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

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

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

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

Изменить 34 до 64. –

+0

не должен переполняться X * Y * Z? –

+0

если вы используете мой код, то не в другом случае, например, в long ints YES. – Svisstack

2

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

+0

long int имеет 32 бита, если вы делаете хорошие отбрасывания, тогда переменная будет переполняться! Это число после умножения имеет 1 в 34 бит. – Svisstack

+0

Или вы можете '#define X 2527L' – sje397

+0

@Svisstack - не всегда. см. http://stackoverflow.com/questions/589575/c-size-of-int-long-etc – sje397

1

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

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

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

main() 
{ 
long long c = (long long)X*Y*Z; 
printf("%lld",c); 
} 
+1

Я думаю, что вы хотите отличить значения #define до умножения. long long c = (длинный длинный) X * (длинный длинный) Y * (длинный длинный) Z; Я немного ржавчина с C, поэтому возьмите это с солью. – DwB

+1

Кастинг однажды должен сделать трюк. Оставшиеся операции будут автоматически выполняться с использованием 64-битного вычисления. –

0
#define  X 2527.0 
#define  Y 2463 
#define  Z 3072 

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

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