2010-11-22 79 views
4

我出生在現代世界,所以我不經常需要處理這類事情,但有人可以解釋如何在下面的代碼中獲得正確的數字。 這裏是衆多嘗試:簡單的C問題

#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

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

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

將34更改爲64. – 2010-11-22 12:50:11

+0

不應該X * Y * Z溢出? – 2010-11-22 12:51:24

+0

如果你使用我的代碼,那麼在其他情況下,例如在長整型是。 – Svisstack 2010-11-22 12:52:32

2

問題是,常量不會被解釋爲長整數,只有在計算表達式後纔會轉換爲長整數。你可以將它們轉換爲表達式來解決這個問題,或者簡單地將它們定義爲長常量。此外,long可能還不夠,如果支持long long,則應該使用long long。

+0

長整型有32位,如果你做好演員,那麼變量也會溢出!乘法後的這個數字在34位中有1。 – Svisstack 2010-11-22 12:50:30

+0

或者你可以'#define X 2527L' – sje397 2010-11-22 12:50:58

+0

@Svisstack - 並不總是如此。請參閱http://stackoverflow.com/questions/589575/c-size-of-int-long-etc – sje397 2010-11-22 12:52:06

1

是的,你越來越溢出。答案不適合32位有符號整數,long 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值。長長c =(長長)X *(長長)Y *(長長)Z;我對C有點生疏,所以請帶上一粒鹽。 – DwB 2010-11-22 12:54:17

+1

施法一次應該做的伎倆。剩餘操作將自動使用64位計算執行。 – 2010-11-22 13:01:18

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

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

你也可以使用雙。