正常に動作するC#を使用して.Net3.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つの言語間で動作が異なるのですか?
おそらく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
「乗算してオーバーフローをチェックする」という呼び出しmul
を行っており、C#はオーバーフローをチェックしない呼び出しを行っています。
おそらく、 C#が一方の方法で、VBがもう一方の方法で実行する理由についての質問には答えませんが、少なくとも、なぜそれが発生しているのかについては答えます。:)
編集:「理由」を取得するには、アクィナスによる回答を参照してください。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加