Javaでは、算術計算の結果のデータ型は、計算に含まれる数値のデータ型に依存することがわかっています。例えば 、java算術計算の結果のデータ型
INT + INT = INT
ダブル=ダブル/長い
。しかし、私はこれらすべてのルールを私に与えることができる参照を見つけることができません。誰か助けてくれますか?
b。算術計算のオーバーフローを避けるには?例えば、2の長さの結果はもう長いものに収まらないかもしれません...
ありがとうございます。
Javaでは、算術計算の結果のデータ型は、計算に含まれる数値のデータ型に依存することがわかっています。例えば 、java算術計算の結果のデータ型
INT + INT = INT
ダブル=ダブル/長い
。しかし、私はこれらすべてのルールを私に与えることができる参照を見つけることができません。誰か助けてくれますか?
b。算術計算のオーバーフローを避けるには?例えば、2の長さの結果はもう長いものに収まらないかもしれません...
ありがとうございます。
a。これらのルールは数値昇格ルールと呼ばれ、Java Language Specification
bで指定されます。オーバーフローを処理するには、一般に認められている2つの方法があります。
最初の方法は、オペレーションを行うポストチェックで、加算を行い、その結果がいずれかのオペランドより大きいかどうかをチェックします。たとえば:
int c = a + b;
if(c<a) { // assuming a>=0 and b>=0
// overflow happened
}
第二の方法は、あなたが基本的に最初の場所で起こってからのオーバーフローを回避しようと事前チェック、です。例:
if(a > Integer.MAX_INTERGER - b) {
// overflow happened
}
これらのルールを扱うJava言語仕様の特定のセクションはsection 4です。
値がまったくオーバーフローしないようにするには、BigInteger
などの任意精度の算術演算タイプを使用します。
一般的なケースでオーバーフローを回避するために、(私が貢献)Guavaはオーバーフローで例外をスローIntMath.checkedAdd(int, int)
とLongMath.checkedMultiply(long, long)
のような方法を提供します。 (これらのうちのいくつかは自分自身を実装するのは重要ではありませんが、これらはすべての完全テスト済みです)。ソースを見れば、どのように動作するかを見ることができますが、ほとんどはかわいいビットtwiddlingトリックに頼ってオーバーフローを効率的にチェックします。
操作に2つのタイプが含まれる場合、小さいタイプは大きいタイプに変換されます。
は、ここで詳細を見るhttp://mathbits.com/MathBits/Java/DataBasics/Mathoperators.htm
任意の2つの基本整数オペランドに対する演算結果は、少なくともINTあろう - オペランドがバイトと短い場合であっても。
最初のチェックは必ずしも有効ではありません。 bが負の場合、 'c
それは本当です。これを例に追加します。しかし、私はそのアプローチを説明しているに過ぎず、絶対的な解決策を提示していません。 –
ええ、私はそれが完全な解決策ではないことを知っています。私はちょうどそれを指摘したいので、ポスターは逐語としてそれを取らなかった。 –