2009-05-13 4 views

답변

170

그냥 수행 (int)myLongValue. 이것은 정확히 unchecked 컨텍스트 (컴파일러 기본값 임)에서 원하는 것을 정확하게 수행합니다 (MSB를 삭제하고 LSB를 가져옴).

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

동일한 질문이있는 사람은 누구입니까? MSB를 삭제하면 결과의 * 기호 *에 영향을 미칠 수 있습니다. 위와 같이'myIntValue'는'myLongValue'가 양수이면 ('4294967294 => -2'), 그 반대의 경우 ('-4294967296 => 0') 음수가 될 수 있습니다. 예를 들어'CompareTo' 연산을 구현할 때, 다른 하나의 'long'을 'int'로 빼고 그 결과를 행복하게 캐스팅 할 수 없습니다. 일부 값의 경우, 비교 결과가 부정확 할 수 있습니다. –

+18

'새로운 무작위 (체크되지 않은 (DateTime.Now.Ticks)가 체크되지 않음)' –

+16

@Chris :'새로운 Random()'은 후드에서'Environment.TickCount'를 사용합니다; 수동으로 시계 틱으로 시드 할 필요가 없습니다. –

25
Convert.ToInt32(myValue); 

을 나는 그것이 int.MaxValue보다 클 때 그것이 무엇을 할 것인지 모르는 비록 : 값이 int에 맞지 않는 경우는 checked 맥락에서 OverflowException을 던질거야.

+34

* "int.MaxValue보다 컸을 때 무엇을 할 지 모르겠지만"* OP가 원하지 않는 'OverflowException'을 throw합니다. http://msdn.microsoft.com /en-us/library/d4haekc4.aspx –

+4

myValue> Integer.Max 일 때 다른 처리를 수행해야하는 경우 변환을 실행하기 전에 myValue> Integer.Max인지 테스트하십시오. Convert.ToInt32 (myValue)는 오버플로 (예외는 아님, 그렇지 않습니다). 이 방법은 VB.NET에서도 작동합니다. – TamusJRoyce

+3

(int)가 유효하지만 Convert가 더 나은 대답입니다. 기묘한 데이터보다 이상한 예외를 갖는 것이 좋습니다. –

13

실제로 실제 값에 관심이 없지만 체크섬/해시 코드으로 사용하는 경우가 있습니다. 이 경우, 내장 된 방법 GetHashCode()은 좋은 선택이다 : 안전하고 빠른 방법은 주조 이전에 비트 마스킹을 사용하는 것입니다

int checkSumAsInt32 = checkSumAsIn64.GetHashCode(); 
+5

이 답변이 주어진 이후로 얼마 전 이었지만, .NET 버전간에 해시 코드 구현이 다를 수 있음을 언급하십시오. 이것은 실제로는 일어나지 않을 수도 있지만이 값이 다른 응용 프로그램 실행/appdomain간에 동일하다는 보장은 없습니다. – Caramiriel

+1

@Caramiriel이 말하는 내용에 추가하려면 : 현재 응용 프로그램 세션 중에 * 임시 * 해시 코드로 사용하는 경우 'GetHashCode'가 적절한 선택입니다. 앱을 나중에 실행할 때 동일하게 유지되는 값인 * 지속적인 체크섬 * 뒤에 있다면 GetHashCode를 사용하지 마십시오. 동일한 알고리즘을 영원히 유지할 수는 없습니다. – ToolmakerSteve

6

...

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

비트 마스크 (0xFFFFFFFF) int 크기는 기계에 따라 다르기 때문에 값은 Int의 크기에 따라 달라집니다.

+0

결과가 오버플로되거나 음수가 될 때 수행 할 작업을 결정해야합니다. 당신이 보여주는 것은 IIRC가 여전히 오버플로 할 것입니다. 왜냐하면 당신이 부호 비트를 통과시키기 때문입니다. [다른 답에서 언급했듯이,'unchecked' 컨텍스트에서는 오버플로가 발생하지 않을 것입니다. 그러나 오버플로를 피하기 위해'unchecked '를 마스크 할 필요가 없기 때문에 해결책은'checked' 컨텍스트에서만 필요합니다.] 16 비트의 예. 부호있는 16 비트 보유 (-32768, 32767) 0xFFFF로 마스킹하면 65535까지의 값이 허용되어 오버 플로우가 발생합니다 (IIRC). 긍정적 인 경우에만 부호 비트, 0x7FFF 또는 0x7FFFFFFF를 피하기 위해 마스크 할 수 있습니다. – ToolmakerSteve