Tôi muốn chuyển đổi long
sang int
.
Nếu giá trị của long
> int.MaxValue
, tôi rất vui khi để nó quấn quanh.
cách tốt nhất là gì?
Tôi muốn chuyển đổi long
sang int
.
Nếu giá trị của long
> int.MaxValue
, tôi rất vui khi để nó quấn quanh.
cách tốt nhất là gì?
Câu trả lời:
Cứ làm đi (int)myLongValue
. Nó sẽ làm chính xác những gì bạn muốn (loại bỏ MSB và lấy LSB) trong unchecked
ngữ cảnh (là mặc định của trình biên dịch). Nó sẽ ném OverflowException
vào checked
ngữ cảnh nếu giá trị không phù hợp trong int
:
int myIntValue = unchecked((int)myLongValue);
new Random()
sử dụng Environment.TickCount
dưới mui xe; không cần phải gieo hạt bằng tay với đồng hồ tích tắc.
unchecked
, vì vậy trừ khi bạn thay đổi rõ ràng, thì unchecked
từ khóa (như thể hiện trong câu trả lời này và bình luận của @ ChrisMarisic, v.v.) là không cần thiết, và int myIntValue = (int)myLongValue
hoàn toàn tương đương. Tuy nhiên, xin lưu ý rằng bất kể bạn có sử dụng unchecked
từ khóa hay không, bạn sẽ nhận được hành vi cắt xén thô lỗ phi toán học được mô tả bởi @TJCrowder trong đó dấu hiệu có thể lật trong một số trường hợp tràn. Cách duy nhất để thực sự đảm bảo tính chính xác toán học là sử dụng checked(...)
bối cảnh, trong đó những trường hợp đó sẽ đưa ra một ngoại lệ.
Convert.ToInt32(myValue);
Mặc dù tôi không biết nó sẽ làm gì khi nó lớn hơn int.MaxValue.
OverflowException
, đó chính xác là những gì OP không muốn: msdn.microsoft.com/en-us/l Library / d4haekc4.aspx
Convert
là không tốt.
if (value > Int32.MaxValue)
return Int32.MaxValue;
else
return Convert.ToInt32( value );
Đôi khi bạn không thực sự quan tâm đến giá trị thực tế, nhưng trong việc sử dụng nó dưới dạng tổng kiểm tra / mã băm . Trong trường hợp này, phương thức tích hợp GetHashCode()
là một lựa chọn tốt:
int checkSumAsInt32 = checkSumAsIn64.GetHashCode();
GetHashCode
là một lựa chọn thích hợp. Nếu bạn theo dõi tổng 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ì đừng sử dụng GetHashCode
, vì nó không được đảm bảo là cùng một thuật toán.
Cách an toàn và nhanh nhất là sử dụng Bit Masking trước khi sử dụng ...
int MyInt = (int) ( MyLong & 0xFFFFFFFF )
Giá trị Bit Mask ( 0xFFFFFFFF
) sẽ phụ thuộc vào kích thước của Int vì kích thước Int phụ thuộc vào máy.
unchecked
ngữ cảnh bạn sẽ không bị tràn - nhưng bạn không cần che dấu unchecked
để tránh tràn, do đó, chỉ cần một giải pháp trong checked
ngữ cảnh.] Ví dụ cho 16 bit. Ký giữ 16 bit (-32768, 32767). Tạo mặt nạ với 0xFFFF cho phép giá trị lên tới 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.
Nó có thể chuyển đổi bằng
Phương thức Convert.ToInt32
Nhưng nó sẽ ném OverflowException nếu giá trị nằm ngoài phạm vi của Kiểu Int32. Một bài kiểm tra cơ bản sẽ cho chúng ta thấy nó hoạt động như thế nào:
long[] numbers = { Int64.MinValue, -1, 0, 121, 340, Int64.MaxValue };
int result;
foreach (long number in numbers)
{
try {
result = Convert.ToInt32(number);
Console.WriteLine("Converted the {0} value {1} to the {2} value {3}.",
number.GetType().Name, number,
result.GetType().Name, result);
}
catch (OverflowException) {
Console.WriteLine("The {0} value {1} is outside the range of the Int32 type.",
number.GetType().Name, number);
}
}
// The example displays the following output:
// The Int64 value -9223372036854775808 is outside the range of the Int32 type.
// Converted the Int64 value -1 to the Int32 value -1.
// Converted the Int64 value 0 to the Int32 value 0.
// Converted the Int64 value 121 to the Int32 value 121.
// Converted the Int64 value 340 to the Int32 value 340.
// The Int64 value 9223372036854775807 is outside the range of the Int32 type.
Ở đây có một lời giải thích dài hơn.
Sẽ không
(int) Math.Min(Int32.MaxValue, longValue)
là cách chính xác, nói một cách toán học?
longValue
đến biểu diễn gần int
nếu giá trị ban đầu là rất lớn. Nhưng nó thiếu cách xử lý tương tự đối với các đầu vào quá âm, thay vào đó sẽ mất các bit đáng kể nhất; bạn sẽ cần phải so sánh với Int32.MinValue
. Tuy nhiên, áp phích ban đầu dường như không muốn kẹp.
myIntValue
có thể kết thúc âm khimyLongValue
dương (4294967294 => -2
) và ngược lại (-4294967296 => 0
). Vì vậy, khi thực hiện mộtCompareTo
thao tác, chẳng hạn, bạn không thể vui vẻ chuyển kết quả của việc trừ đi cái này sang cáilong
khácint
và trả lại cái đó; đố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.