Javaの整数型の算術演算が常に「int」または「long」の結果になる理由を誰かが説明できますか?
6 に答える
これ(整数を生成する整数の算術演算)は、Javaだけでなく、多くの多くのプログラミング言語の機能であることを指摘する価値があると思います。
それらのプログラミング言語の多くはJavaの前に発明され、多くはJavaの後に発明されたので、ハードウェアの能力が低かった時代からの二日酔いであるという議論は非常に広いと思います。言語設計のこの機能は、言語をタイプセーフにすることです。プログラミング言語で整数と浮動小数点数を分離し、タイプからタイプへの変換がいつどのように行われるかをプログラマーに特定させるのには、非常に正当な理由があります。
これをチェックしてください:http: //www.particle.kth.se/~lindsey/JavaCourse/Book/Part1/Java/Chapter02/operators.html#ArithOps
オペランドのタイプによって戻り値のタイプがどのように決定されるかを説明します。基本的に:
- 算術演算子には数値型が必要です
- いずれかのオペランドの型が整数型の場合、戻り値は含まれる最も広い型になります(つまり、int + long = long)
- いずれかのオペランドの型が浮動小数点数の場合、浮動小数点数が返されます
- 両方のオペランドが浮動小数点の場合、どちらかのオペランドがdoubleの場合、doubleが返されます。
タイプを制御する必要がある場合は、オペランドを適切なタイプにキャストする必要があります。たとえば、int * intはintには長すぎる可能性があるため、次のようにする必要があります。
long result = myInt * (long) anotherInt
同様に、算術演算の結果として生じる非常に大きいまたは非常に小さいフロートの場合。
なぜあなたはdouble
またはBigInteger
結果を得られないのですか?主に歴史的な事故と効率の理由。+
またはからのオーバーフローを検出し*
、結果(たとえば、から)を渡すことは、Integer.MAX_VALUE * Integer.MAX_VALUE
ほとんどトリガーされないが、常に実行する必要がある多くの例外検出コードを生成することを意味します。2 ^ 32(または2 ^ 64)を法として加算または乗算を定義する方がはるかに簡単で、心配する必要はありません。小数の余りがある除算についても同じです。
これは確かにずっと前のCの場合でした。今日では、スーパースカラープロセッサと多くのビットで遊ぶことはそれほど問題ではありません。しかし、人々はそれに慣れていたので、それは今日でもJavaに残っています。結果を保持できるタイプに算術演算を自動変換する場合は、Python3を使用します。
その理由は、Java にプリミティブ型がある理由とまったく同じです。これにより、効率的なコードを記述できます。また、効率は低下しますが、正しいコードははるかに醜くなると主張するかもしれません。あなたはほぼ正しいでしょう。デザインの選択は 1995 年頃に行われたことに注意してください。
int
基本的な整数算術演算子は と の間、int
またはlong
との間でしか定義されていないためlong
です。それ以外の場合、型は自動的に拡張されます。Java言語仕様には、何が起こるかを正確に説明するいくつかの難解な段落があることは間違いありません。
ダミーの答え: これはJava 言語仕様で定義されているためです。
4.2.2. 整数演算
Java プログラミング言語には、整数値に作用する多数の演算子が用意されています。
[...]
int
or型の値になる数値演算子long
: