C#とVB.Netの同じプログラムのオーバーフロー動作の違い

Nikhil Agrawal

正常に動作する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]

編集
0

コメントを追加

0

関連記事

分類Dev

Cフォークプログラムの動作の説明

分類Dev

プロローグ:述語のオーバーライドと使用の違い

分類Dev

C プログラムの char バッファーの予期しないオーバーフロー

分類Dev

VB.NETのモジュールと同様のC#のグローバル「モジュール」

分類Dev

C#とVB.Net、シャドウイングと[オーバーロード(引数を変更せずに)]の違いは何ですか

分類Dev

Javaクラスのグローバル変数のスコープと同じクラスのメソッドでのそれらの動作

分類Dev

C#/。NETの符号付き整数オーバーフロー動作は定義されていますか?

分類Dev

vb.netとC#の問題でのコーディングの違い

分類Dev

同じネットワーク内のグローバルIPを決定するvb.net、C#

分類Dev

同じマシンでコンパイルされたプログラムを実行すると、GLIBCXXのバージョンが間違っている

分類Dev

systemdとターミナル起動プログラムの違い

分類Dev

C#でのコンストラクターのオーバーロードとチェーンの違い

分類Dev

プログラムでVb.netにローカルのMYSQLサーバーを作成するにはどうすればよいですか?xamppが提供するものと同じですか?

分類Dev

横棒グラフと同じ列名の2つのデータフレームをプロットする

分類Dev

同じCプログラムの3つのバージョン、なぜ最初のバージョンはそれほど速いのですか?

分類Dev

ワードラップとオーバーフローラップの違いは何ですか?

分類Dev

同じグラフ内の複数のバープロットは、同じ軸と同じバー幅を維持します

分類Dev

動作していない数値のモールス信号を返すC#プログラム

分類Dev

ChromeとEdgeのオーバーフローの違い

分類Dev

「ubuntuソフトウェアセンター」デスクトッププログラムでの「閉じる」と「リロード」の違いは何ですか?

分類Dev

チェックされていないuintのC#オーバーフロー動作

分類Dev

C ++でのラムダのオーバーロードとclangとgccの違い

分類Dev

C#Windowsフォームの同じListViewコントロール内でListViewItemsを並べ替え/移動/ドラッグドロップします

分類Dev

C#変数と定数は、オーバーフロー中の動作が異なります。

分類Dev

2人のユーザーが同じプログラムで作業しているときに問題が発生する

分類Dev

HBaseテーブル上のプレーンJavaプログラムとMapReduceJavaプログラムの違い

分類Dev

Tkinter とサブプロットの動作でのメモリ オーバーフロー

分類Dev

プログラムを切り替えるときのWindowsタスクバーの動作を変更する

分類Dev

オーバーフローラップとワードブレイクの違いは?

Related 関連記事

  1. 1

    Cフォークプログラムの動作の説明

  2. 2

    プロローグ:述語のオーバーライドと使用の違い

  3. 3

    C プログラムの char バッファーの予期しないオーバーフロー

  4. 4

    VB.NETのモジュールと同様のC#のグローバル「モジュール」

  5. 5

    C#とVB.Net、シャドウイングと[オーバーロード(引数を変更せずに)]の違いは何ですか

  6. 6

    Javaクラスのグローバル変数のスコープと同じクラスのメソッドでのそれらの動作

  7. 7

    C#/。NETの符号付き整数オーバーフロー動作は定義されていますか?

  8. 8

    vb.netとC#の問題でのコーディングの違い

  9. 9

    同じネットワーク内のグローバルIPを決定するvb.net、C#

  10. 10

    同じマシンでコンパイルされたプログラムを実行すると、GLIBCXXのバージョンが間違っている

  11. 11

    systemdとターミナル起動プログラムの違い

  12. 12

    C#でのコンストラクターのオーバーロードとチェーンの違い

  13. 13

    プログラムでVb.netにローカルのMYSQLサーバーを作成するにはどうすればよいですか?xamppが提供するものと同じですか?

  14. 14

    横棒グラフと同じ列名の2つのデータフレームをプロットする

  15. 15

    同じCプログラムの3つのバージョン、なぜ最初のバージョンはそれほど速いのですか?

  16. 16

    ワードラップとオーバーフローラップの違いは何ですか?

  17. 17

    同じグラフ内の複数のバープロットは、同じ軸と同じバー幅を維持します

  18. 18

    動作していない数値のモールス信号を返すC#プログラム

  19. 19

    ChromeとEdgeのオーバーフローの違い

  20. 20

    「ubuntuソフトウェアセンター」デスクトッププログラムでの「閉じる」と「リロード」の違いは何ですか?

  21. 21

    チェックされていないuintのC#オーバーフロー動作

  22. 22

    C ++でのラムダのオーバーロードとclangとgccの違い

  23. 23

    C#Windowsフォームの同じListViewコントロール内でListViewItemsを並べ替え/移動/ドラッグドロップします

  24. 24

    C#変数と定数は、オーバーフロー中の動作が異なります。

  25. 25

    2人のユーザーが同じプログラムで作業しているときに問題が発生する

  26. 26

    HBaseテーブル上のプレーンJavaプログラムとMapReduceJavaプログラムの違い

  27. 27

    Tkinter とサブプロットの動作でのメモリ オーバーフロー

  28. 28

    プログラムを切り替えるときのWindowsタスクバーの動作を変更する

  29. 29

    オーバーフローラップとワードブレイクの違いは?

ホットタグ

アーカイブ