算術演算子
今回は「算術演算子」についてみていきます。算術演算子は計算のもっとも基本の四則演算( +、-、×、÷ )と割り算における余りを求める演算子です。
算術演算子の種類
| 種類 | 演算子 | 説 明 |
|---|---|---|
| 足し算(加算) | + | 計算の加算だけでなく、文字列の結合にも使います。 |
| 引き算(減産) | - | 引算の計算をします。 |
| 掛け算(乗算) | * | 掛け算の計算をします。× でなく * です。 |
| 割り算 (除算) | / | 割り算の計算をします。 ÷ でなく / です。 |
| 余り(剰余) | % | 割り算したときの余りを求めます。 |
【サンプル】
public class sample01 {
public static void main(String[] args) {
System.out.println( 1 + 2 ); //表示:3
System.out.println( 1 - 2 ); //表示:-1
System.out.println( 1 * 2 ); //表示:2
System.out.println( 10 / 2 ); //表示:5
System.out.println( 9 % 2 ); //表示:1
}
}
計算結果を表示しているサンプルです。普段生活でしている計算結果と同じになります。注意するところは掛け算の記号が「×」→「*」、割り算の記号が「÷」→「/」になっているぐらいです。割り算はあえて割り切れるようにしています。「整数÷整数」の場合、結果の型の規則で少数部分が切り捨てられます。結果の型の規則はこの後詳しくみていきます。
計算結果後のデータ型
計算結果後のデータ型はどうなるのかみていきます。計算なので基本は「整数型と整数型の計算」「浮動小数点型と浮動小数点型の計算」「整数型と浮動小数点型の計算」になります。
(1)大分類での規則
- 整数型と整数型の計算結果は「整数型」
- 浮動小数点型と浮動小数点型の計算結果は「浮動小数点型」
- 整数型と浮動小数点型の計算結果は「浮動小数点型」
(2)表現範囲での規則
- 整数型同士の場合:
long型が含まれていれば「long型」それ以外は「int型」 - 浮動小数点型同士の場合:
double型が含まれていれば「double型」それ以外は「float型」 - 整数型と浮動小数点型の場合:
double型が含まれていれば「double型」それ以外は「float型」
| byte | short | int | long | float | double | |
|---|---|---|---|---|---|---|
| byte | int | int | int | long | float | double |
| short | int | int | int | long | float | double |
| int | int | int | int | long | float | double |
| long | long | long | long | long | float | double |
| float | float | float | float | float | float | double |
| double | double | double | double | double | double | double |
覚えることが多そうにみえますがまとめてみると
double > float > long > int
の優先順位で、優先順位の高い方が計算結果の型になるだけです。上記4つの型が何も含まれない計算(byteとshortなど)では計算結果は「int型」になります。
計算結果で表現範囲を超えたら
たとえばint型とint型の計算結果は「int型」になりますが、結果が「int型」の表現範囲を超えてしまったらどうなるのか?結論を先に言ってしまうとそのままの型です。「int型」の表現範囲を超えてしまったからといってlong型にはなりません。計算の原理を知っていないと全く予想外の数字で戸惑うかも知れません。
【サンプル】
public class sample01 {
public static void main(String[] args) {
System.out.println( 2147483647 + 3 ); //結果:-2147483646
}
}
簡単に復習です。変数 (基本型)でint型の上限は「2147483647」であることを説明しました。リテラルで整数リテラルのデフォルトのデータ型はint型であることを説明しました。まとめれば整数の値をそのまま記述できる上限は「2147483647」であるということです。それ以上の数字を使う場合は語尾に「L」をつけてlong型にする必要がありました。
サンプルではint型の上限にさらに「+3」しています。「2147483650」を期待したいところですが結果は「-2147483646」になります。

突然ですが雑学です。Javaでマイナスってどのように処理してるんでしょう?たとえば「-13」を2進数で表示したいと思います。int型だと32ビット(32桁)で桁数が大きくなるのでbyte型(8桁)で考えてみます。
- 最上位の桁は符号ビットである。
8ビットの場合、8桁全部使えば最大255まで表示することができます。しかし8桁とも使ってしまうとマイナスの表現ができません。最上位は符号ビットとして使う為、数字表現部分は残り7桁になりbyte型の上限は127になります。 - 反転して1を加えた数をマイナスの2進数の値とする。
マイナスの表現方法にはいくつかありますが、上記の方法を「2の補数」といいます。なぜ単純に符号ビットだけを「1」にしないのかというと、この2の補数の値を使うと引き算が加算処理だけでできるようになります。
例えば上記図から 13は2進数で「00001101」です。-13は2進数で「11110011」です。13-13を計算すると「00001101 + 11110011 = 100000000」です。8ビットなので9桁目は切り捨てられ「00000000」になります。10進数も当然0なので「13-13=0」になります。
では本題に戻ります。int型の2147483647は2進数では
01111111111111111111111111111111
です。この値に3を加えます。
10000000000000000000000000000010
桁上がりし最上位ビットが1になりました。最上位部は符号ビットなので桁あがりによりマイナス扱いになります。どのような値なのかみてみます。反転して1を加えることによりマイナス表現すると先ほど説明しました。逆をすれば値がわかります。
1を引いて反転します。
01111111111111111111111111111110
10進数に直すと 2147483646。つまり -2147483646をあらわしています。サンプルプログラムの計算結果と一致しました。
次回は「int型とint型の割り算」の注意点についてみていきたいと思います。
2010 年 2 月 17 日 水曜日 【 カテゴリー: Javaの基本 】
