我出生在現代世界,所以我不經常需要處理這類事情,但有人可以解釋如何在下面的代碼中獲得正確的數字。 這裏是衆多嘗試:簡單的C問題
#define X 2527
#define Y 2463
#define Z 3072
main()
{
long int c = X*Y*Z;
printf("%ld",c);
}
我只是想打印一個長整型,但它始終是印刷錯誤的結果。我得到整數溢出 - 如果是的話我怎麼能阻止它們?或者它是我對printf格式化程序的選擇?
我出生在現代世界,所以我不經常需要處理這類事情,但有人可以解釋如何在下面的代碼中獲得正確的數字。 這裏是衆多嘗試:簡單的C問題
#define X 2527
#define Y 2463
#define Z 3072
main()
{
long int c = X*Y*Z;
printf("%ld",c);
}
我只是想打印一個長整型,但它始終是印刷錯誤的結果。我得到整數溢出 - 如果是的話我怎麼能阻止它們?或者它是我對printf格式化程序的選擇?
溢出是可以的,因爲你試圖將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);
}
問題是,常量不會被解釋爲長整數,只有在計算表達式後纔會轉換爲長整數。你可以將它們轉換爲表達式來解決這個問題,或者簡單地將它們定義爲長常量。此外,long可能還不夠,如果支持long long,則應該使用long long。
是的,你越來越溢出。答案不適合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);
}
我想你想在乘法之前施加#define值。長長c =(長長)X *(長長)Y *(長長)Z;我對C有點生疏,所以請帶上一粒鹽。 – DwB 2010-11-22 12:54:17
施法一次應該做的伎倆。剩餘操作將自動使用64位計算執行。 – 2010-11-22 13:01:18
#define X 2527.0
#define Y 2463
#define Z 3072
main()
{
double c = X*Y*Z;
printf("%lf",c);
}
你也可以使用雙。
將34更改爲64. – 2010-11-22 12:50:11
不應該X * Y * Z溢出? – 2010-11-22 12:51:24
如果你使用我的代碼,那麼在其他情況下,例如在長整型是。 – Svisstack 2010-11-22 12:52:32