CおよびC++では、符号付き整数オーバーフローまたはアンダーフローの動作は未定義です。C#とJava仕様は符号付き整数オーバーフローで同じ動作をしますか?
JavaおよびC#(チェックされていないコンテキスト)では、動作がある程度定義されているようです。 Java仕様から
、我々は持っている:
整数演算子がどのような方法でオーバーフローやアンダーフローを示すものではありません。
そして:
Javaプログラミング言語は、整数の2の補数表現を使用しています[...] C#の仕様から
、我々は持っている:
[...]チェックされていないコンテキストでは、オーバーフローは無視され、宛先タイプに収まらない上位ビットが破棄されます。
の両方をテストすることで、私が期待されるラップアラウンドの結果を得ました。仕様の文言から判断すると、Javaでは結果が移植性があると感じています(言語には2の補数表現が必要です).C#にはその結果がある場合とない場合があります(表現を指定していない - 上位ビットのみが破棄される)。
したがって、両方の言語仕様は、すべてのプラットフォームで同じ動作を保証しますか(言葉が異なるだけです)。あるいは、私のテストケース(x86とSunのJREとMicrosoftの.NETの下で)はお互いに同じだが、理論的には他のアーキテクチャや実装では違うのだろうか?
言語の動作がうまく定義されている場合は、プラットフォーム間でその違いが違いますか? – JimmyB
@HannoBinder私は、*定義された*という言葉を使うと、* undefined *とは対照的です - JavaやC#ではどちらも定義されていません。しかし、この仕様がポータブルな結果を出すかどうか、あるいは実装を*実装定義*としてそのまま残すかどうかはまだ分かりません。 –
[System.Int32 documentation](https://msdn.microsoft.com/en-us/library/system.int32.aspx)の* Decimal以外の32ビット整数値の処理*を参照すると、少なくともintの場合、すべてのプラットフォームで表現が同じであることを確認してください。私はそれが他のタイプでも同じだと思う。 –