답변:
그냥하세요 (int)myLongValue
. unchecked
컨텍스트 (컴파일러 기본값) 에서 원하는 것을 정확하게 수행합니다 (MSB를 삭제하고 LSB를 가져 옵니다). 이 던질거야 OverflowException
에 checked
값이에 맞지 않을 경우 상황 int
:
int myIntValue = unchecked((int)myLongValue);
new Random()
사용 Environment.TickCount
합니다. 시계 틱으로 수동 시드 할 필요가 없습니다.
unchecked
이므로 명시 적으로 변경하지 않으면 unchecked
키워드 (이 답변 및 @ChrisMarisic의 의견 등)에 표시된 키워드가 필요하지 않으며 int myIntValue = (int)myLongValue
정확히 동일합니다. 그러나 unchecked
키워드 사용 여부에 관계없이 @TJCrowder가 설명하는 비 수학적 무례 자르기 동작이 발생하여 일부 오버플로 경우 부호가 뒤집힐 수 있습니다. 수학적 정확성을 실제로 보장하는 유일한 방법은 checked(...)
상황 을 사용하는 것입니다. 이러한 경우에는 예외가 발생합니다.
Convert.ToInt32(myValue);
int.MaxValue보다 클 때 어떻게 될지 모르겠습니다.
OverflowException
영업 이익이 원하지 않는 정확히 무엇 인 : msdn.microsoft.com/en-us/library/d4haekc4.aspx
Convert
좋지 않다.
if (value > Int32.MaxValue)
return Int32.MaxValue;
else
return Convert.ToInt32( value );
때로는 실제 값에 관심이 없지만 checksum / hashcode 로 사용하는 데 관심이 있습니다. 이 경우 내장 방법 GetHashCode()
이 적합합니다.
int checkSumAsInt32 = checkSumAsIn64.GetHashCode();
GetHashCode
하는 경우 적절한 선택입니다. 당신이 후에 경우 지속적으로 체크 - 나중에 응용 프로그램을 실행할 때 동일합니다 값, 다음 사용하지 않는 GetHashCode
것이 영원히 동일한 알고리즘이 보장되지 않는.
안전하고 빠른 방법은 전송하기 전에 비트 마스킹을 사용하는 것입니다.
int MyInt = (int) ( MyLong & 0xFFFFFFFF )
0xFFFFFFFF
Int 크기는 컴퓨터에 따라 다르므로 비트 마스크 ( ) 값은 Int 크기에 따라 다릅니다.
unchecked
컨텍스트에서는 오버플로가 발생하지 않지만 오버플로 unchecked
를 피하기 위해 마스킹 할 필요는 없으므로 checked
컨텍스트 에서만 솔루션이 필요합니다 .] 16 비트의 예. 부호있는 16 비트 보류 (-32768, 32767). 0xFFFF를 사용한 마스킹은 최대 65535의 값을 허용하여 오버플로 IIRC를 발생시킵니다. 양수 만 원하는 경우 부호 비트 0x7FFF 또는 0x7FFFFFFF를 피하기 위해 마스크 할 수 있습니다.
그것은에 의해 변환 할 수 있습니다
Convert.ToInt32 메서드
그러나 값이 Int32 유형의 범위를 벗어나면 OverflowException이 발생합니다. 기본 테스트는 작동 방식을 보여줍니다.
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.
여기에 더 이상 설명이있다.
하지 않을
(int) Math.Min(Int32.MaxValue, longValue)
수학적으로 말하면 올바른 방법일까요?
longValue
가장 가까운 표현할에 int
원래 값이 큰에있는 경우. 그러나 너무 부정적인 입력에 대한 동일한 처리가 부족하여 대신 가장 중요한 비트가 손실됩니다. 당신 Int32.MinValue
도 비교해야합니다 . 그러나 원래 포스터는 클램핑을 원하지 않는 것 같습니다.
myIntValue
경우myLongValue
양수 (4294967294 => -2
)이고 그 반대의 경우 (-4294967296 => 0
) 음수로 끝날 수 있습니다 .CompareTo
예를 들어, 작업을 구현할 때long
서로 빼는 결과를 행복하게 캐스팅하여int
반환 할 수 없습니다 . 일부 값의 경우 비교 결과가 올바르지 않습니다.