2009-05-13 36 views

Trả lời

170

Chỉ cần làm (int)myLongValue. Nó sẽ thực hiện chính xác những gì bạn muốn (loại bỏ các MSB và lấy LSB) trong ngữ cảnh unchecked (mặc định là trình biên dịch). Nó sẽ ném OverflowException trong checked bối cảnh nếu giá trị không phù hợp trong một int:

int myIntValue = unchecked((int)myLongValue); 
+12

Đối với bất kỳ ai khác có cùng câu hỏi tôi đã làm: Lưu ý rằng việc loại bỏ MSB có thể ảnh hưởng đến * dấu * của kết quả. Với ở trên, 'myIntValue' có thể kết thúc âm khi' myLongValue' là dương ('4294967294 => -2') và ngược lại (' -4294967296 => 0'). Vì vậy, khi thực hiện một hoạt động 'CompareTo', ví dụ, bạn có thể không hạnh phúc đúc kết quả của việc trừ một' long' từ một thành 'int' và trả về giá trị đó; đối với một số giá trị, so sánh của bạn sẽ mang lại kết quả không chính xác. –

+18

+1 được sử dụng trong 'mới Ngẫu nhiên (bỏ chọn ((int) DateTime.Now.Ticks)) ' –

+16

@Chris:' new Random() 'sử dụng' Environment.TickCount' dưới mui xe; không cần phải hạt giống bằng tay với đồng hồ ve. –

25
Convert.ToInt32(myValue); 

Mặc dù tôi không biết những gì nó sẽ làm gì khi nó lớn hơn int.MaxValue.

+34

* "Mặc dù tôi không biết nó sẽ làm gì khi nó lớn hơn int.MaxValue" * Nó sẽ ném một 'OverflowException', đó là chính xác những gì OP không muốn: http://msdn.microsoft.com /en-us/library/d4haekc4.aspx –

+4

Kiểm tra xem myValue> Integer.Max trước khi chạy chuyển đổi, nếu bạn cần thực hiện việc xử lý khác khi myValue> Integer.Max. Convert.ToInt32 (myValue) sẽ tràn (không có ngoại lệ, tôi tin) nếu không. Phương thức này cũng hoạt động trong VB.NET. – TamusJRoyce

+3

Trong khi (int) là hợp lệ, Chuyển đổi là một câu trả lời tốt hơn. Tốt hơn là có ngoại lệ lạ hơn dữ liệu lạ. –

13

Đôi khi bạn không thực sự quan tâm đến giá trị thực tế, nhưng khi sử dụng nó là tổng kiểm tra/mã băm. Trong trường hợp này, được xây dựng trong phương pháp GetHashCode() là một lựa chọn tốt:

int checkSumAsInt32 = checkSumAsIn64.GetHashCode(); 
+5

Đã lâu rồi kể từ khi câu trả lời này được đưa ra, mặc dù tôi muốn đề cập đến việc triển khai hashcode có thể khác nhau giữa các phiên bản .NET. Điều này có thể không thực sự xảy ra, nhưng không có gì đảm bảo rằng giá trị này giống nhau giữa các ứng dụng/appdomain khác nhau. – Caramiriel

+1

Để thêm vào những gì @Caramiriel đang nói: nếu sử dụng dưới dạng mã băm * tạm thời *, trong phiên ứng dụng hiện tại của bạn, thì 'GetHashCode' là một lựa chọn thích hợp. Nếu bạn sau * kiểm tra liên tục * - một giá trị sẽ giống nhau khi bạn chạy ứng dụng của mình sau, thì không sử dụng 'GetHashCode', vì nó không được đảm bảo là cùng một thuật toán mãi mãi. – ToolmakerSteve

6

Cách an toàn và nhanh nhất là sử dụng Bit Masking trước dàn diễn viên ...

int MyInt = (int) (MyLong & 0xFFFFFFFF) 

Các Bit Mask (0xFFFFFFFF) giá trị sẽ phụ thuộc vào kích thước của Int vì Int kích thước phụ thuộc vào máy.

+0

Cần quyết định điều bạn muốn xảy ra khi kết quả sẽ tràn hoặc trở thành số âm. Những gì bạn hiển thị sẽ vẫn tràn, IIRC, bởi vì bạn đang để cho các dấu hiệu bit thông qua. [Như đã đề cập trong một câu trả lời khác, trong ngữ cảnh 'unchecked' bạn sẽ không bị tràn - nhưng bạn không cần che dấu trong 'unchecked' để tránh tràn, vì vậy chỉ cần một giải pháp trong ngữ cảnh' checked'.] Ví dụ cho 16 bit. Ký 16-bit giữ (-32768, 32767). Mặt nạ với 0xFFFF cho phép giá trị lên đến 65535, gây tràn, IIRC. Có thể che dấu để tránh bit dấu, 0x7FFF hoặc 0x7FFFFFFF, nếu chỉ muốn tích cực. – ToolmakerSteve

Các vấn đề liên quan