2011-08-10 2 views
0

한 버전은C#에서 ushort를 어떻게 변환합니까?

short value = unchecked((short)0x8010); 

다른 버전 작동하지 않습니다 아래처럼, 그리고 예외

short value = Convert.ToInt16(0x8010); 
short value = (short)(0x8010); 

되지 않은 키워드가없는 다른 버전이

을 던질 것인가?

업데이트 : 예상 다음은 short에 맞게 모든 ushort 값을 변환 short.MaxValue로하지 않는 모든 값을 대체하기 위해 노력할 것 -32752

+3

? 0x8010이 short.MaxValue보다 큽니다. 따라서 오류가 발생하거나 오버플로 된 값을 기대합니까? –

+2

0x8010은 부호없는 짧은 문장이 아닙니다 ... –

+0

[MSDN] (http://msdn.microsoft.com/en-us/library/yht2cx7b%28v=80.aspx)에 따르면 * 명시 적 숫자 변환으로 인해 정밀도가 떨어지거나 예외가 발생할 수 있습니다. * –

답변

5

의 음의 값이다. 이것은 손실이 많은 변환입니다.

ushort source = ...; 
short value = source > (ushort)short.MaxValue 
    ? short.MaxValue 
    : (short)source; 

당신이 (하지만 난 그것을 권하고 싶지 않다)

[StructLayout(LayoutKind.Explicit)] 
struct EvilConverter 
{ 
    [FieldOffset(0)] short ShortValue; 
    [FieldOffset(0)] ushort UShortValue; 

    public static short Convert(ushort source) 
    { 
     var converter = new EvilConverter(); 
     converter.UShortValue = source; 
     return converter.ShortValue; 
    } 
} 
+0

좋은 답변입니다. 나는 OP가 C 스타일의 비트 재 해석을 찾고 있다고 생각한다. 처음에는 결코 좋은 생각이 아니었고 C#에서는 올바르지 않게 작동했다. –

7

당신이 무엇을 기대 value 다음을 수 할 수있는 직선 비트 변환을 찾고 있다면?

0x8010 = 32784

짧은 범위는 -32768 그래서 값 32784가 단기간에 의해 표현할 수없는 32,767이다. 0x8010으로 저장된 short는 음수로 해석됩니다. 네가 원하는 음수인가?

또 다른 SO 질문 C#, hexadecimal notation and signed integers에 따르면이 경우 음수로 해석되기를 원하면 unsafe 키워드를 C#에서 사용해야합니다.

+0

데이터 손실을 지적 해 주셔서 감사합니다. +1 – Aren

+0

'안전하지 않은 것'으로 인해 그 행동이 어떻게 바뀌 었는지 설명해 주셔서 감사합니다. 왜 [BitConverter] (https://github.com/dotnet/coreclr/blob/master/src/mscorlib/src/System/BitConverter.cs#L106)가 그런 식으로 프로그래밍되어 있는지 알아 내려고했습니다. – Toxantron

0

내가 제안 : 당신이 기대하고 무엇 출력

ushort input; 
short output; 
output = short.Parse(input.ToString("X"), NumberStyles.HexNumber)); 
관련 문제