2

Int32 を返すが、計算などに unsigned int (UInt32) を使用する VB.Net 関数がある場合、たとえば「3392918397」という値を持つ変数「MyUintVar32」を VB.Net の標準 Int32 に変換するにはどうすればよいですか? ?

C# で "return (int)(MyUintVar32);" を実行すると、エラーではなく -902048899 が返されます。

私はいくつかの異なる方法を試しました。c# がこれらの変換を処理する方法と VB.Net の違いは何ですか?

4

5 に答える 5

7

これは古い投稿だと思いますが、質問にはまだ回答がありません。私が知りたい他の人々:

Dim myUInt32 As UInt32 = 3392918397  
Dim myInt32 As Int32 = Convert.ToInt32(myUInt32.ToString("X"), 16)  

逆の操作:

myUInt32 = Convert.ToUInt32(myInt32.ToString("X"), 16)

また、ユニオン構造を作成して、Int32 と UInt32 の間で簡単に変換することもできます。

Imports System.Runtime.InteropServices

<StructLayout(LayoutKind.Explicit)> _    
  Public Structure UnionInt32  
  <FieldOffset(0)> _  
  Public IntValue As Int32  
  <FieldOffset(0)> _  
  Public UIntValue As UInt32  
End Structure  

Dim MyUnionInt32 as UnionInt32  
MyUnionInt32.UIntValue = 3392918397  
Dim IntVal as Int32 = MyUnionInt32.UIntValue  '= -902048899 

逆の操作:

MyUnionInt32.IntValue = -902048000  
Dim UIntVal as UInt32 = MyUnionInt32.UIntValue  '= 3392919296  

乾杯、テンウェア

于 2011-04-01T16:58:32.470 に答える
3

3392918397 は大きすぎて符号付き 32 ビット整数に収まりません。3392918397 の最上位ビットが設定されているため、負になるのはそのためです。

1100 1010 0011 1011 1101 0011 0111 1101

符号付き整数型内でこの比率の整数を維持したい場合は、次のサイズの 64 ビット符号付き整数を使用する必要があります。

于 2008-10-16T21:35:33.513 に答える
2

これは最適な解決策ではありませんが、BitConverter を使用して uint からバイト配列を取得し、バイト配列を int に変換できます。

Dim myUInt32 As UInt32 = 3392918397
Dim myInt32 As Int32 = BitConverter.ToInt32(BitConverter.GetBytes(myUInt32), 0)
于 2008-10-16T21:35:33.013 に答える
0

3392918397 は大きすぎて 31 ビットに収まらないため、Int32 に変換できません。UInt32 を返すように関数を変更しないのはなぜですか?

于 2008-10-16T21:36:41.140 に答える
-1

または、Uint32 の作業を行った後、MAXINT と 0 に対してチェックします。

> MAXINT かつ < 0 の場合は問題ありません。そうでない場合は、「オーバーフロー」し、例外をスローする必要があります。

MAXINT が定義されているかどうかは覚えていません。代わりに 2^31 - 1 を使用できます。

于 2008-10-16T21:46:33.273 に答える