23

C#0/0、例外が発生した場合。

しかし、あなた0.0/0または0.0/0.0あなたが得た場合double.NaNdouble.Infinityそれぞれ。

しかし、これらの結果を にキャストするとint、0 になります。

> (int)double.PositiveInfinity
0
> (int)double.NaN
0

これはなぜですか?無限大は明らかにゼロではないため、ランタイムはキャストエラーを発生させるはずではありませんか?

4

2 に答える 2

17

コンテキストの種類によって異なります。checkedコンテキストを使用すると、例外が発生します。仕様の関連セクションはセクション 6.2.1 です。

float または double から整数型への変換の場合、処理は、変換が行われるオーバーフロー チェック コンテキスト (§7.6.12) によって異なります。

  • チェックされたコンテキストでは、変換は次のように進行します。
    • オペランドの値が NaN または無限の場合、System.OverflowException がスローされます。
    • それ以外の場合、ソース オペランドはゼロに向かって最も近い整数値に丸められます。この整数値が変換先の型の範囲内にある場合、この値は変換の結果です。
    • それ以外の場合は、System.OverflowException がスローされます。
  • チェックされていないコンテキストでは、変換は常に成功し、次のように進みます。
    • オペランドの値が NaN または無限の場合、変換の結果は変換先の型の指定されていない値になります。
    • それ以外の場合、ソース オペランドはゼロに向かって最も近い整数値に丸められます。この整数値が変換先の型の範囲内にある場合、この値は変換の結果です。
    • それ以外の場合、変換の結果は宛先タイプの未指定の値になります。

したがって、チェックされていないコンテキストでは、答え必ずしも 0 ではありません。これは未指定のint値です。実際、私のテストでint.MinValueは、チェックされていないコンテキストでは 0 ではなく表示されます。

ただし、基本的に、チェックを行いたい場合は、チェックされたコンテキストを使用します (少なくともその式には)。

于 2013-01-09T19:16:13.867 に答える
0

これは主に、 double.NAN と double.PositiveInfity (または double.Negative ) が数値ではなく、概念を識別するための値であるという事実によるものです。

演算の結果がundefinedの場合、メソッドまたは演算子は NaN を返します。たとえば、次の例に示すように、0 を 0 で除算した結果は NaN になります。

その概念を説明するためにこれを試してください。

if ((0 / zero) == Double.NaN) 
     Console.WriteLine("0 / 0 can be tested with Double.NaN.");
  else 
     Console.WriteLine("0 / 0 cannot be tested with Double.NaN; use Double.IsNan() instead.");
于 2013-01-09T19:27:26.830 に答える