2013-08-01 15 views
1

나는 How can one simplify network byte-order conversion from a BinaryReader?을 읽었으며이 질문의 초기 코드는 UInt32Int32 사이의 명시 적 형 변환 기능에 대해 생각하게했습니다. 내 주요 관심사는 Int32.MaxValue보다 크거나 0보다 작은 값입니다.캐스팅 UInt32에서 Int32 : 다른 컴파일러 결과

이 캐스트가 동일해야하지만, 하나의 작품과 다른 오류가 발생합니다

public static void TestConverstion() 
{ 
    // runs just fine, CastBack == aUInt 
    UInt32 aUInt = UInt32.MaxValue; // 4294967295 
    Int32 anInt = (Int32)aUInt; // -1 
    UInt32 castBack = (UInt32)aUInt; // 4294967295 

    // Build Error: Constant value '4294967295' cannot be converted to a 'int' (use 'unchecked' syntax to override) 
    UInt32 oneLineCastBack = (UInt32)(Int32)UInt32.MaxValue; 
} 

이유는 유효 하나가 아닌 다른입니다?

이 캐스트의 동작은 어디에서 문서화되어 있습니까? 가장 좋은 문서는 Explicit Numeric Conversions Table (C# Reference)으로, 명시 적 형변환이 있음을 인정하지만 명시 적 형변환은 "정밀도를 잃거나 예외를 throw 할 수 있습니다"라고 경고합니다. 실험에서 예외가 발생하지 않으며 정밀도가 손실되지 않는다고 말합니다.

UInt32 Structure는 제안이 UInt32 당신이 Int32.MaxValue 이상하지만 UInt32.MaxValue 이하의 값을 나타 내기 위해 필요할 때 그냥 Int64을 사용하고 절반 비트를 낭비해야 Common Language Specification의 일부가 아니기 때문에.

+0

문서화 된 부분은 어디입니까? http://msdn.microsoft.com/en-us/library/2xf6xbyc.aspx, http://msdn.microsoft.com/en-us/library/aa288039.aspx. MSDN은 기본적인 내용에 대해 거의 모든 질문에 대답 할 수 있습니다. – cHao

+1

첫 번째 변수가'변수 '이므로 컴파일러는 두 번째 변수가'상수 '인 경우 컴파일러가 추측 할 수없는 것을 알 수 있으므로 컴파일러가 범위를 알고 오류로 불만을 제기합니다. –

+0

Convert.ToInt32 (uint)는 (Int32) (uint)와 동일한 작업입니까? –

답변

1

코드 배치 방법은 잠재적 인 결과를 결정하는 컴파일러의 기능을 처리하는 것입니다. 정말 변화가 없습니다.

이 두 번째가 const직접 주조입니다
unchecked { UInt32 oneLineCastBack = (UInt32)(Int32)UInt32.MaxValue; } 

당신이주는 두 예제의 유일한 차이가 있는지 : 오류 메시지가 당신에게 알 수 있듯이,이 작업을 수행하고 동일한 결과에 도달 할 수 값은 Int32으로 컴파일러는 즉시 오류로 인식 할 수 있습니다.

+0

http://msdn.microsoft.com/en-us/library/a569z7k8(v=vs.71).aspx "checked 또는 unchecked를 사용하지 않으면 상수식이 기본 오버플로 검사를 사용합니다. 컴파일 시간을 확인하고 그렇지 않은 경우 표현식이 일정하지 않으면 런타임 오버플로 검사는 컴파일러 옵션 및 환경 구성과 같은 다른 요소에 따라 달라집니다."- 따라서 값은 변수에 할당 된 후 일정하지 않게됩니다. 다음에 발생할 일을 설명하는 언어가 모호합니다. –

+0

나는 거기에 있습니다. 모호합니다.하지만 올바르게, 환경에 대한 설명은 없습니다. 감각 및 컴파일러 옵션을 포함 할 수 있습니까? 목록을 통해 제거 할 수는 있지만 ... http : //msdn.microsoft.com/en-us/library/19z1t1wy.aspx – DonBoitnott

+0

올바른 컴파일러 옵션이 될 수 있습니다. http : // msdn microsoft.com/ko-us/library/8wtf2dfz.aspx 자르기의 경우를 보여 주지만 같은 비트 수의 비트 표현이 다른 경우는 언급하지 않습니다. –