2009-05-06 54 views
7

我在.NET程序目睹一個奇怪的現象:爲什麼我的.net Int64的行爲就像他們是Int32的?

Console.WriteLine(Int64.MaxValue.ToString()); 
// displays 9223372036854775807, which is 2^63-1, as expected 

Int64 a = 256*256*256*127; // ok 

Int64 a = 256*256*256*128; // compile time error : 
//"The operation overflows at compile time in checked mode" 
// If i do this at runtime, I get some negative values, so the overflow indeed happens. 

爲什麼我的Int64的行爲就好像他們的Int32的,雖然Int64.MaxValue似乎證實了他們正在使用64位?

如果是相關的,我使用的是32位操作系統,所以使用Int32算術執行的整個操作的目標平臺設置爲「任何CPU」

回答

20

你的RHS只使用Int32值,那麼Int32結果被提升爲一長。

它改成這樣:

Int64 a = 256*256*256*128L; 

和一切都會好的。

+1

蕩你喬恩斯基特!你打了我大約10秒! :) – 2009-05-06 13:32:16

+0

我覺得很蠢:)謝謝! – Brann 2009-05-06 13:32:36

+0

你不傻,剛開始時有點不直觀。當我預料到「double res = someInt/otherInt」做了一個浮點除法(它沒有)並且知道左手邊沒有關係的時候,我被咬了。 – 2009-05-06 13:37:22

4

用途:

Int64 a = 256L*256L*256L*128L; 

將L後綴表示Int64的文字,沒有後綴指的Int32。

什麼您寫道:

Int64 a = 256*256*256*128 

表示:

Int64 a = (Int32)256*(Int32)256*(Int32)256*(Int32)128; 
+0

建議使用大寫後綴'L',因爲它更容易識別,在某些字體中,您甚至無法區分'1'和'l' – 2014-05-30 03:12:44

相關問題