1

これは本当に簡単な答えだと思いますが、理解できません。フォーマットの値が表示されましたが、UInt32最大値は65535です。Int16表示される範囲が-32768〜32767になるように、これをプレゼンテーション用のフォーマットに変換する必要があります。

単純なConvert.ToInt16(65535)場合、65535が大きすぎるか小さすぎるという例外がスローされInt16ます。

これを処理するための組み込み関数はありますか、それとも誰かが私にこれの解決策を教えてもらえますか?

編集:さらに議論を投稿して再度編集-65535は範囲シフトされておらず、実際には-32768であるため、UInt3265535からInt16-32768への変換を実行したいと考えています。これまでのすべての回答に感謝します。

4

7 に答える 7

4

たぶん私は何かが足りないのですが、あなたはこのようなことをすることができませんか?

UInt32 val = 65535;
Int16 result = (Int16)(val - 32768)
于 2013-03-01T08:59:07.187 に答える
4

それはあなたが正確に何を望んでいるかによって異なります。以下を使用できます。

int i = 65535;
Int16 x = (Int16) i;

これは、65535 を -1 に、65534 を -2 に、などとマッピングします。

ただし、範囲0〜65535を-32768〜+32767にシフトしたい場合は、次を使用できます

int yourvalue = 65535; // value between 0...65535
int i = yourvalue - 32768;
Int16 x = (Int16 ) i;
于 2013-03-01T09:13:00.000 に答える
3

ビットを int16 として再解釈したいと仮定します (つまり、65535 -> -1)。

UInt32  x = 65536;
Int16   y = BitConverter.ToInt16( BitConverter.GetBytes( x ), 0 );
于 2013-03-01T09:03:21.217 に答える
1

何も組み込まれていないので、自分で書く必要があります。これを行うための拡張メソッドは次のとおりです。

public static short ConvertToInt16(this uint source)
{
    return (short)(source - 32768);
}

そしてその反対:

public static uint ConvertToUInt32(this short source)
{
    return (ushort)(source + 32768);
}
于 2013-03-01T08:59:18.187 に答える
0

コードであまり多くのマジックナンバーを使用したくない場合は、次を追加するだけで範囲をシフトできますInt16.MinValue

short displayValue = (short)(value + Int16.MinValue);

ソース値が指定した範囲に収まらない場合、これはオーバーフローすることに注意してください。したがって、そのオーバーフローをチェックする場合は、checked式にラップするか(オーバーフロー時に例外をスローします)、またはを使用Math.Minして上限を強制することができ65535ます。

short displayValue = (short)(Math.Min(value, UInt16.MaxValue) + Int16.MinValue);
于 2013-03-01T09:01:04.647 に答える
0

編集後、次のようなものを求めていると思います

static Int16 Convertor(UInt32 val)
{
    if (val > Int16.MaxValue)
    {
        var h = (val - Int16.MaxValue) * -1;
        if (h < Int16.MinValue)
        {
            throw new OverflowException();
        }

        return (Int16)h;
    }

    return (Int16)val;
}

とのbyteレイアウトを次のようなコードと比較すると、Int16 -32768UInt32 65535

var b = BitConvertor.GetBytes(val);
Console.Write('[')
for (var i = 0; i < b.Length - 1; i++)
{
    Console.Write(b[i]);
    Console.Write(", ");
}

Console.Write(b[b.Length - 1]);
Console.WriteLine(']');

次のような出力が得られます

[0, 128] // の場合Int16 -32768

[255, 255, 0, 0] // の場合UInt32 65535

必要な結果を得るための単純なバイト単位の変換は見当たりません。

于 2013-03-01T09:57:41.100 に答える
-1
UInt32 source = ...

Int16 result = (Int16) (source > 32767 ? source - 65536 : source);
于 2013-03-01T09:00:40.053 に答える