次のスニペットはゼロと評価されます。
int result = unchecked((int)double.MaxValue);
一方、これを行う場合:
double x = double.MaxValue
int result = (int)x;
結果は(これを推測しますか?)int.MinValue
です。その事実だけでも十分に奇妙です[以下を参照]がunchecked
、変換が確実に失敗したり、オーバーフローが発生したりすることを知らないふりをするコードをコンパイラーに強制的に発行させることを意図した印象を受けました。つまり、コンパイラが関連する値を認識していない場合と同じ結果が得られるはずです(「算術オーバーフローのチェック」が無効になっている場合)。
それで、ここで何が起こっているのですか?私の理解はunchecked
間違っていますか?
C#/。NET標準に従って、結果の1つは「間違っている」ですか?
編集:int.MinValue
簡単に説明できます:cvttsd2si
オーバーフローが発生したが例外がマスクされている場合に0x80000000を返します。これは、逆アセンブリウィンドウに表示されるように、JITコンパイラによって使用される命令です。しかし、それは問題のどの部分も解決しません。
ECMA 334(C#2仕様)によると、unchecked
キーワードは常に切り捨てられる必要があるため、次の両方の場合で結果はゼロになります。
int result1 = unchecked((int)double.MaxValue);
double x = double.MaxValue;
int result2 = unchecked((int)x);
しかし、そうではありません、2番目のものはを与えint.MinValue
ます。これはまだ私にはコンパイラのバグのようなにおいがします。