2011-08-10 196 views
0

1つのバージョンは、以下のようなC#でushortをshortに変換するにはどうすればよいですか?

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〜32767であるので、値32784は、短いでは表現できません。 0x8010として格納されるshortは、負の数として解釈されます。あなたはそれが負の数ですか?

別のSOの質問C#, hexadecimal notation and signed integersによれば、この場合はC#でunsafeというキーワードを使用して、負の数として解釈する必要があります。

+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)); 
関連する問題