0

VB.NetLongを使用して aを aに変換しようとすると問題が発生しULong. ます。多くの組み合わせを試しましたが、オーバーフロー エラーが発生し続けます。私は -2147483648 の符号付きの値を持っていUlongます。変換すると 2151196588 になることがわかっています。

ただし、負と正の値を解析しているため、プログラムでこれを行いたいのですが、数値が負の場合は適切なulong値が必要です。注: 絶対値は機能しませんulong。真の値である必要があります。ありがとうございました。

4

4 に答える 4

2

BitConverterクラスを使用できます。

Dim a As Int64 = -2147483648
Dim b = BitConverter.ToUInt64(BitConverter.GetBytes(a), 0)
Console.WriteLine(b.ToString) ' outputs: 18446744071562067968

2151196588の意図した値が正しいことを確認しますか?

于 2013-02-22T23:01:55.217 に答える
2

これは、任意のLong を ULongに変換する最も簡単な方法です。

Dim x As Long = -2147483648
Dim y As ULong = Not (CType((Not x), ULong)) ' = 18446744071562067968

私は C# プログラマーなので、間違って VB.NET に変換した場合は修正してください。私のC#コードは次のとおりです。

long x = -2147483648;
ulong y = ~((ulong)~x); // = 18446744071562067968

基本的に、常に正の値である負の値の補数を取ります。その後、ULong に安全にキャストできます。補数をもう一度取ると、同じビット パターンが ULong にキャストされます。

于 2013-02-22T23:54:39.427 に答える
2

あなたが意味する場合は、同じテクニックreinterpret_cast<ulong>(long)を使用してください:

<Runtime.InteropServices.StructLayout(Runtime.InteropServices.LayoutKind.Explicit)> _
Public Structure LongULongUnion
    <Runtime.InteropServices.FieldOffset(0)> Public l As Long
    <Runtime.InteropServices.FieldOffset(0)> Public ul As ULong
End Structure


Sub Main()
    Dim u As LongULongUnion

    u.l =  -2147483648L
    Console.WriteLine(u.ul)

    Console.ReadLine()
End Sub

しかし、それは18446744071562067968変換すると得られます。

于 2013-02-22T21:46:48.127 に答える
0

値を ulong に変換する前に、必ず正の値に変換してください。負の値は ulong の値のスコープには含まれません。

long: -9223372036854775808 to 9223372036854775807
ulong: 0 to 18446744073709551615
于 2013-02-22T21:44:12.673 に答える