2016-01-03 3 views
11

CおよびC++では、符号付き整数オーバーフローまたはアンダーフローの動作は未定義です。C#とJava仕様は符号付き整数オーバーフローで同じ動作をしますか?

JavaおよびC#(チェックされていないコンテキスト)では、動作がある程度定義されているようです。 Java仕様から


、我々は持っている:

整数演算子がどのような方法でオーバーフローやアンダーフローを示すものではありません。

そして:

Javaプログラミング言語は、整数の2の補数表現を使用しています[...] C#の仕様から


、我々は持っている:

[...]チェックされていないコンテキストでは、オーバーフローは無視され、宛先タイプに収まらない上位ビットが破棄されます。


の両方をテストすることで、私が期待されるラップアラウンドの結果を得ました。仕様の文言から判断すると、Javaでは結果が移植性があると感じています(言語には2の補数表現が必要です).C#にはその結果がある場合とない場合があります(表現を指定していない - 上位ビットのみが破棄される)。

したがって、両方の言語仕様は、すべてのプラットフォームで同じ動作を保証しますか(言葉が異なるだけです)。あるいは、私のテストケース(x86とSunのJREとMicrosoftの.NETの下で)はお互いに同じだが、理論的には他のアーキテクチャや実装では違うのだろうか?

+0

言語の動作がうまく定義されている場合は、プラットフォーム間でその違いが違いますか? – JimmyB

+1

@HannoBinder私は、*定義された*という言葉を使うと、* undefined *とは対照的です - JavaやC#ではどちらも定義されていません。しかし、この仕様がポータブルな結果を出すかどうか、あるいは実装を*実装定義*としてそのまま残すかどうかはまだ分かりません。 –

+0

[System.Int32 documentation](https://msdn.microsoft.com/en-us/library/system.int32.aspx)の* Decimal以外の32ビット整数値の処理*を参照すると、少なくともintの場合、すべてのプラットフォームで表現が同じであることを確認してください。私はそれが他のタイプでも同じだと思う。 –

答えて

1

Javaでは、移植性はJava Language Specificationで保証されています。プリミティブ型intの周りのすべての規則は32ビット2の補数の符号付きです。次に標準ライブラリ自体は値をラップするIntegerクラスを実装し、いくつかの便利なメソッドを追加しますが、範囲とオーバーフローに関する限り本質的に同じです。

.NETにはCLRによって定義されたプリミティブ型もあり、これらも言語に応じて異なるクラスとエイリアスでラップされます。 Common Language Specification - esp. Common Type Systtemを参照してください。

Javaあなたの質問にお答えするために、コードは言語仕様とJVM実装によって確実に移植されています。 .NET(CLRはCLレベルで動作するCLSではないため、CLRも実行されるため)コードをCLS Compliantにすることでコードを移植可能にする必要があります。良いお知らせは、intおよび/またはSystem.Int32を使用すると、CLSに準拠し、ポータブルであることができます。

関連する問題