爲什麼下面的代碼拋出異常「算術運算導致溢出。」?爲什麼「UInt64 [] arr = new UInt64 [UInt64.MaxValue];」拋出異常?
UInt64[] arr=new UInt64[UInt64.MaxValue];
爲什麼下面的代碼拋出異常「算術運算導致溢出。」?爲什麼「UInt64 [] arr = new UInt64 [UInt64.MaxValue];」拋出異常?
UInt64[] arr=new UInt64[UInt64.MaxValue];
我猜是因爲被要求完全8 * UInt64.MaxValue
字節來分配,而這顯然乘法溢出64位的寄存器。
這將永遠不會被分配,因爲即使你擁有那麼多的內存,C#對內存數組長度也有限制。當你指定一個合法的長度值,但沒有內存時,你會得到'異常類型'System.OutOfMemoryException'被拋出'的錯誤信息。 – 2010-03-19 14:35:26
因爲
一)所有的對象都限制爲2GB的.NET
b)你沒有64個PB的存儲花費
因爲索引只需要Int32值。你可以做
UInt64[] arr=new UInt64[Int32.MaxValue];
但這就是極限。
編輯:從技術上講,你可以索引一個數組的值結構,理論上它可以比Int32.MaxValue更高(因爲你可以索引一個數組,例如長或uint),但是,你會遇到那個運行時錯誤當該值超過Int32.MaxValue時。
UInt64 [] arr1 =新的UInt64 [Int32.MaxValue]引發相同的錯誤,但UInt64 [] arr1 =新的UInt64 [Int16.MaxValue]沒有。 – Techee 2010-03-22 05:44:48
根據微軟的文檔,用框架.NET 4.5以下限制:
你真的想分配一個18艾字節數組...? – 2010-03-19 13:35:22
我只是想創建最大長度的整數數組包含值作爲每個數組元素的索引。我的數組將是[0] [1] [2] [3] [4] .. [1000] .... [最大]。在這裏我需要找到最大值。 – Techee 2010-03-19 13:46:37
@Greg,它是18 x 10^18個元素*每個元素8個字節,換句話說就是147,573,952,589,676,412,928字節(147字節,或根據維基百科http://en.wikipedia.org/wiki/Exabyte,大約8個月整個互聯網上的流量)。 – 2010-03-19 14:35:53