型 | 値 | サイズ | 定数の例 |
byte | 符号付き整数 | 8ビット | 100 |
short | 符号付き整数 | 16ビット | 1000 |
char | 符号なし整数 | 16ビット | 'c' |
int | 符号付き整数 | 32ビット | -1000000 |
long | 符号付き整数 | 64ビット | 10000000000L |
float | 浮動小数点数 | 32ビット | -3.45e+4 |
double | 浮動小数点数 | 64ビット | 4.195e-300 |
char は文字コードを表すもの.UNICODE と呼ばれる世界中の文字を16ビット で表すことを目指したコード系を用いて文字を整数に変換する.プログラム中 ではchar型の定数は,「'a'」のように表す.ASCII文字についてはASCIIの8ビットのコード(man ascii で見られる)と一致している(例 'a' -> 97).
float, doubleは実数データを表すのに用いる.浮動小数点数というのは, 実数を2進法で表した時の桁数を表すビット(指数部)とその時の上位の桁 を表すビット(仮数部)によって表現する. -3.45e+4 という定数は, -3.45 に 10の4乗(=10000)を掛けた数. すなわち-34500を表す.
この中で,よく使う型は int と double で他の型は主にメモリを節約する必 要がある場合,低レベルの入出力をおこなう場合にしか使われない.それらの 必要がなければ,他の型はあまり気にしなくて良い.数を扱うために,さまざまな演算子が用意されている.この演算子を組み合わ せることにより,数式と同じように演算を自然な式の形で表現することができ る.このように,演算の対象とする式の間に置かれる演算子を中置演算子 (infix operatr)と言う. Javaの演算子の主なものを以下にあげる.
優先順位 | 演算子 | 扱うデータ型 | 結合規則 | 演算の内容 |
1 | + | 数値 | 右 | 単項演算子のプラス |
1 | - | 数値 | 右 | 単項演算子のマイナス |
2 | * | 数値 | 左 | 乗算 |
2 | / | 数値 | 左 | 除算 |
2 | % | 数値 | 左 | 剰余 |
3 | + | 数値 | 左 | 加算 |
3 | - | 数値 | 左 | 減算 |
5 | < | 数値 | 左 | より小さい |
5 | <= | 数値 | 左 | 以下 |
5 | > | 数値 | 左 | より大きい |
5 | >= | 数値 | 左 | 以上 |
6 | == | 基本データ型 | 左 | 等しい |
6 | != | 基本データ型 | 左 | 等しくない |
13 | = | 左辺は変数 | 右 | 代入 |
優先順位, 結合規則は, 複数の演算子を含む式をどう解釈するかを表す. たとえば,
1 + 2 * 3は, '*'の優先順位が'+'よりも高いので, 2 と 3の乗算の実行後に1との加算 をおこなうということになる. これを1と2の加算の実行後に3と乗算するよう に変更するには,
(1+2)*3のように書けば良い.
式を自然に書けない言語もある.たとえば,Lispという言語では (1+2)を表 現するのに,(+ 1 2) という前置記法を用い,Forth という言語では1 2 + と いう逆ポーランド記法を用いる.それぞれの方法にメリットがあり熱狂的なファ ンも多いが,主流となる言語は中置演算子を用いてきた.
実数は整数と濃度が違うとい
う集合論の理論でもあきらかなように,すべての実数が2進数で表せるわけで
はない.したがって,計算機で実数を扱う場合は何らかの近似を行う.そのた
め,実数演算をおこなう場合は誤差を無視することができない.たとえば,
(1.0/3.0)*3.0 は誤差が入るため,1.0とは違う.
class PowerOf10{ public static void main(String[] args){ // java PowerOf10 ??? // で起動した 「???」の部分の文字列 args[0] を // 整数値に変換して,nに入れる. int n=Integer.parseInt(args[0]); int i,v=1; // i 回繰り返す for(i=0;i< n;i++){ // vを10倍する. v*=10; } System.out.println("10の"+i+"乗は"+v+"です"); } } ca20121$ java PowerOf10 0 10の0乗は1です ca20121$ java PowerOf10 9 10の9乗は1000000000です ca20121$ java PowerOf10 10 10の10乗は1410065408です ca20121$ java PowerOf10 11 10の11乗は1215752192です ca20121$ java PowerOf10 12 10の12乗は-727379968ですのように整数の場合は,桁あふれを起こしても,エラーを出さずに間違った値が 入ってしまうので注意が必要になる.32ビット(2進数で32桁)しか表せない int 型 の代わりに64ビット(2進数で64桁)表せる long 型を使って,
class PowerOf10{ public static void main(String[] args){ // java PowerOf10 ??? // で起動した 「???」の部分の文字列 args[0] を // 整数値に変換して,nに入れる. int n=Integer.parseInt(args[0]); int i; long v=1; // i 回繰り返す for(i=0;i< n;i++){ // vを10倍する. v*=10; } System.out.println("10の"+i+"乗は"+v+"です"); } }と書くと,
ca20121$ java PowerOf10Long 12 10の12乗は1000000000000です ca20121$ java PowerOf10Long 18 10の18乗は1000000000000000000です ca20121$ java PowerOf10Long 19 10の19乗は-8446744073709551616ですと正しい結果が得られるが,それでもまだ制限はある.更に,doubleを使って,
class PowerOf10Double{ public static void main(String[] args){ // java PowerOf10 ??? // で起動した 「???」の部分の文字列 args[0] を // 整数値に変換して,nに入れる. int n=Integer.parseInt(args[0]); int i; double v=1; // i 回繰り返す for(i=0;i< n;i++){ // vを10倍する. v*=10; } System.out.println("10の"+i+"乗は"+v+"です"); } }とすると,表現可能な範囲は
ca20121$ java PowerOf10Double 20 10の20乗は1.0E20です ca20121$ java PowerOf10Double 308 10の308乗は9.999999999999998E307です ca20121$ java PowerOf10Double 309 10の309乗はInfinityですと広がるが,限界があることには変わりがない.