2012-04-02 9 views
7

Javaでは、算術計算の結果のデータ型は、計算に含まれる数値のデータ型に依存することがわかっています。例えば 、java算術計算の結果のデータ型

  1. INT + INT = INT

  2. ダブル=ダブル/長い

。しかし、私はこれらすべてのルールを私に与えることができる参照を見つけることができません。誰か助けてくれますか?

b。算術計算のオーバーフローを避けるには?例えば、2の長さの結果はもう長いものに収まらないかもしれません...

ありがとうございます。

答えて

3

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 
} 
2

これらのルールを扱うJava言語仕様の特定のセクションはsection 4です。

値がまったくオーバーフローしないようにするには、BigIntegerなどの任意精度の算術演算タイプを使用します。

一般的なケースでオーバーフローを回避するために、(私が貢献)Guavaはオーバーフローで例外をスローIntMath.checkedAdd(int, int)LongMath.checkedMultiply(long, long)のような方法を提供します。 (これらのうちのいくつかは自分自身を実装するのは重要ではありませんが、これらはすべての完全テスト済みです)。ソースを見れば、どのように動作するかを見ることができますが、ほとんどはかわいいビットtwiddlingトリックに頼ってオーバーフローを効率的にチェックします。

1

任意の2つの基本整数オペランドに対する演算結果は、少なくともINTあろう - オペランドがバイトと短い場合であっても。