3

私は正常に動作するC#を使用して.Net 3.5でプログラムを実行しました

try
{
    int i = 2147483647;

    Console.WriteLine((i * 100 / i).ToString());

    Console.ReadLine();
}
catch (Exception)
{                
    throw;
}

このプログラムを C# で実行すると、例外が発生しません ("0" が出力されます)。しかし、このプログラムをVB.Netで実行すると、"Arithmetic operation resulted in an overflow"例外が発生します

Try
    Dim i As Integer = 2147483647

    Console.WriteLine((i * 100 / i).ToString())

    Console.ReadLine()
Catch ex As Exception
    Throw
End Try

これら 2 つの言語の動作が異なるのはなぜですか?

4

3 に答える 3

5

おそらく、IL を見ると明確になるでしょう...コードを少し単純化します。

C#:

int i = 2147483647;
int v = (i * 100 / i);

次の IL を生成します。

IL_0001:  ldc.i4      FF FF FF 7F 
IL_0006:  stloc.0     // i
IL_0007:  ldloc.0     // i
IL_0008:  ldc.i4.s    64 
IL_000A:  mul         
IL_000B:  ldloc.0     // i
IL_000C:  div         
IL_000D:  stloc.1     // v

VBバージョンの間:

Dim i As Integer = 2147483647
Dim v As Integer
v = i * 100 / i

この IL を生成しますが、わずかに異なります。

IL_0001:  ldc.i4      FF FF FF 7F 
IL_0006:  stloc.0     // i
IL_0007:  ldloc.0     // i
IL_0008:  ldc.i4.s    64 
IL_000A:  mul.ovf     
IL_000B:  conv.r8     
IL_000C:  ldloc.0     // i
IL_000D:  conv.r8     
IL_000E:  div         
IL_000F:  call        System.Math.Round
IL_0014:  conv.ovf.i4 
IL_0015:  stloc.1     // v

ご覧のとおり、VB はmul.ovf"乗算してオーバーフローをチェックする" を呼び出しており、C# はmulオーバーフローをチェックしない呼び出しを行っています。

おそらく、C# が一方の方法で VB が他方の方法でそれを行う理由についての質問には答えないかもしれませんが、少なくともそれが起こっている理由には答えます。:)

編集:「理由」を得るには、aquinasの回答を参照してください。

于 2013-07-06T04:20:38.610 に答える
1

プログラムを次のように変更してみてください。

try {
    checked {
        int i = 2147483647;
        Console.WriteLine((i * 100 / i).ToString());
        Console.ReadLine();
    }
}
catch (Exception) {
    throw;
}

C# は、既定では算術チェックを自動的に実行しません。ただし、プロジェクトのプロパティ...[ビルド] タブ..[詳細...] に移動すると、[X] 算術オーバーフロー/アンダーフローをチェックすると、デフォルトで VB.NET と同じ動作が得られます。

于 2013-07-06T04:19:25.640 に答える
0

投稿した VB コードは C# コードと同等ではないため、出力は異なります。正しい変換は次のとおりです。

Console.WriteLine((i * 100 \ i).ToString())

C# は整数に対して整数 (切り捨て) 除算を実行しますが、VB では整数除算演算子 '\' を使用して同じ整数除算を行う必要があることに注意してください。

(更新:正しく変換された整数除算演算子を使用しても、テストで同じ例外が発生するため、明らかに演算子だけではありません)。

于 2013-07-06T05:00:29.537 に答える