3

C#の次のコードは、結果「228452386」を返します。

UInt32 a;

int k = 0;

a = 0x9E3779B9;

a += (UInt32)(url[k + 0] + (url[k + 1] << 8) + (url[k + 2] << 16) + (url[k + 3] << 24));

上記のコードを実行した後、「a」には「228452386」が含まれます。

ただし、 VB.NETの次の同じコードでは、「算術演算でオーバーフローが発生しました」という結果になります。基本的に、最後のステートメントは値「1868983913」を返すため、ランタイムエラーが生成されます。

Dim a As UInt32

Dim k As Integer = 0

a = &H9E3779B9UI

a += CUInt(AscW(url(k + 0)) + (AscW(url(k + 1)) << 8) + (AscW(url(k + 2)) << 16) + (AscW(url(k + 3)) << 24))

上記のコードの変数「url」は任意の文字列であり、両方のコードで同じであることに注意してください。

C#とVB.NETの両方で次のステートメントを実行すると、どちらも同じ値を返します

C#

(UInt32)(url[k + 0] + (url[k + 1] << 8) + (url[k + 2] << 16) + (url[k + 3] << 24))

VB.NET

CUInt(AscW(url(k + 0)) + (AscW(url(k + 1)) << 8) + (AscW(url(k + 2)) << 16) + (AscW(url(k + 3)) << 24))

どちらのステートメントも、「url」「info:microsoft.com」に対して値「1868983913」を返します。しかし、+ = .........を指定して完全なステートメントを実行すると、 C#が値「228452386」を返す間、VB.NETはエラーを返します。

4

3 に答える 3

2

追加する2つの数値を加算した結果は、UIntに収まるものよりも大きいため、オーバーフローが発生します。

結果の数値は33ビットの数値であり、UIntは32ビットにしか適合しません。

  • C#では、最上位ビットが切り取られ、UInt内に収まる32ビットが維持されます。(この新しい値は、数値を追加した実際の結果ではありません。)
  • VB.NETでは、数値が収まらないという例外が発生します。

VB.NETコンパイラ(またはVS)を使用すると、このオーバーフローチェックをオフにできるため、この場合、VB.NETはC#のように動作します。

于 2012-04-20T10:25:02.600 に答える
1

VB.NETはオーバーフローのテストを自動的に挿入しますが、C#は挿入しません。同等のC#コードは次のようになります。

UInt32 a;
int k = 0;
a = 0x9E3779B9;
checked{
    a += (UInt32)(url[k + 0] + (url[k + 1] << 8) + (url[k + 2] << 16) + (url[k + 3] << 24));
}

編集:編集された質問に準拠するようにコードサンプルを変更しました。

于 2012-04-20T08:02:58.363 に答える
0

次のVB.NETコードを使用します。

    a += CUInt(AscW(url(k + 0))) + CUInt((AscW(url(k + 1)) << 8)) + CUInt((AscW(url(k + 2)) << 16)) + CUInt((AscW(url(k + 3)) << 24))

AscW整数(符号付き)を返し、必要なものは符号なしです。

編集

これは機能します:

    Dim a As Int64
    Dim result As UInt32

    Dim k As Integer = 0

    Dim url As String = "info:microsoft.com"

    a = &H9E3779B9UI

    Dim a1 As UInt32 = 0
    Dim a2 As UInt32 = 0
    Dim a3 As UInt32 = 0
    Dim a4 As UInt32 = 0

    a1 = AscW(url(k + 0))
    a2 = AscW(url(k + 1)) << 8
    a3 = AscW(url(k + 2)) << 16
    a4 = AscW(url(k + 3)) << 24

    a = (a + a1 + a2 + a3 + a4) And &HFFFFFFF
    result = Convert.ToUInt32(a)
于 2012-04-20T08:13:46.937 に答える