char型の定数として正しいものを下から選べ。
A: ’abc’
B: ’¥¥’
C: ’¥t’
D: ’¥u3027’
E: ”ABC”
F: ’¥q123’
|
型 |
サイズ |
表現できる値の範囲 |
精度 |
float |
32ビット |
約-3.4×1038〜約-1.2×10-38、0、約1.2×10-38〜約3.4×1038 |
10進数で約7桁 |
double |
64ビット |
約-1.8×10308〜約-2.2×10-308、0、約2.2×10-308〜約1.8×10308 |
10進数で約16桁 |
解説
char型の定数は文字定数といい、シングルクォート(アポストロフィ)「’」で囲みひとつの文字を指定します。複数文字の場合、文字列定数といい、ダブルクォート「”」で囲み指定します。Eは文字列定数です。これはString型になるので、×。またAは3文字あるのでコンパイルエラーになりやはり×。文字aを文字定数として指定したければ「’a’」のようにします。これはシンプルな形。
他にシングルクォートで囲んでエスケープシーケンスを指定することもできます。エスケープシーケンスは
読み物Java 第5章 白黒はっきりさせように載せてありますが、ここでも載せておきましょう。
\b バックスペース
\t タブ
\n 改行
\r 復帰
\" ダブルクォート
\' シングルクォート
\\ 円サイン
B、Cはここに含まれるので○。
もうひとつUnicodeエスケープがあります。これは「¥u」に続いてUnicode文字1文字分のコードを指定したものです。Dの’¥u3027’はひらがなの「ひ」になります。
Fは以上のどれにも含まれないので×。
解答 B C D
次の文の中から間違えているものを選べ。
A. char型変数には文字しか代入できないので、整数の演算には使用できない。
B. byte型のサイズは8ビットで、表現できる値の範囲は−28〜28である。
C. short型、int型、long型のサイズは、処理系によって異なるので、表現可能な最小値、最大値はどれもわからない。
D. boolean型は整数で、trueは1、falseは0で表す。
E. int型のサイズは32ビットで、表現できる値の範囲は−231〜231−1である。
|
解説
小数点の付いた数値データ(
読み物Java 第1章の中では実数値データと呼んでいます)をコンピュータでは浮動小数点という形で記憶します。Javaではこれをfloatとdoubleのどちらかで扱います。よってAは正しいです。
float型とdouble型のサイズと、表現できる値の範囲の表を示します。ここに整数のときにはなかった精度が加わります。範囲も異なりますが、精度も異なるので、Bは間違え。ここで注目してほしいのは、0に限りなく近い数値は、floatでもdoubleでも表現できないということです。また精度の欄にある有効桁数ですがdoubleでも高々16桁である、ということです。やたらと「約」が付いていますが、ビット列で表現されたものを、私たちにわかりやすい10進数で表しているためです。float型の変数に、1.23456787654などと桁数の多い数値を正確に格納させようとしても無理な話、ということです。
さらにややこしいことに0.1など10進数ならスパッときれいな数値でも、float型やdouble型に代入したとたん、精度の関係で本当の0.1ではなくなるのです。参考に次の例を挙げておきます。なんと0.1を10回足しても1にならないのです。出力結果は「-1.1102230246251565E-16」になりました。
double s = 0;
for (int i = 0; i < 10; i++) {
s += 0.1;
}
System.out.println(s - 1);
標準ライブラリのパッケージjava.lang中のクラスDoubleにはdoubleに関する定数がいくつか定義されています。
NEGATIVE_INFINITY 負の無限大
POSITIVE_INFINITY 正の無限大
NaN 非数値
java.langのクラスはパッケージ名なしで使えるので、NaNであればプログラム中ではDouble.NaNのように指定できます。(
→読み物Java 第8章)
NaNは0.0/0.0のような非数値を表します。1.5/0.0はゼロ割なので無限大のPOSITIVE_INFINITYです。−1.5/0.0は負の無限大NEGATIVE_INFINITYになります。Cは間違え。float型については、java.lang.Floatで同じ定数が定義されています。
解答 A
参考
読み物Java 第1章 ハロー、Java
次の文の中から正しいものを選べ。
A. 浮動小数点数の型は、floatとdoubleだけである。
B. float型とdouble型の違いは、扱える値の範囲のみで、精度(有効桁数)は同じである。
C. float型の無限大は、Float.NaN、double型の無限大は、Double.NaNとして定義されている。
|
char型は整数演算に使用でき、サイズは8ビット、符号なしなので範囲は0以上になります。よってAは間違え。
byte型は8ビットですが、範囲は−27〜27−1なのでBも間違え。2の肩の数字はサイズ−1になっているので注意しましょう。また正の数のほうが負の数より1少ないところまでしか表現できないのも要注意。
基本データ型のサイズは一応規定されていて、整数は上の表のとおり。サイズが確定するので、範囲も決まります。よってCは間違え。
boolean型はtrueかfalseのどちらかしか扱えません。C言語のように、1や0で代用することはできないので気をつけましょう。Dは間違え。
Eは正しい。
解答 A B C D
Copyright (c) 2004 Nagi Imai All Rights Reserved..
解説
まず整数を扱う基本データ型についてのサイズと表現できる値の範囲を表に示します。
boolean型の定数として正しいものを下から選べ。
A: ”true”
B: Yes
C: no
D: true
E: True
F: false
G: 0
H: 1
|
型 |
サイズ |
表現できる値の範囲 |
char型 |
16ビット |
0〜216−1 |
byte型 |
8ビット |
−27〜27−1 |
short型 |
16ビット |
−215〜215−1 |
int型 |
32ビット |
−231〜231−1 |
long型 |
64ビット |
−263〜263−1 |
解説
boolean型の定数は、次の二つしかありません。
true false
大文字はだめ!余計なもの付けない!整数では代用できない!よってDとFが正解。
解答 D F
次の宣言があるとき、下の文で、コンパイルエラーにならないものを選べ。
boolean b = true;
char c = 'x';
A: if (b) {
System.out.println("true");
}
B: b = 1;
C: if (c == 12) {
System.out.println("true");
}
D: int a = c + 1;
E: c = 6;
F: c = -6;
|
解説
boolean型はtrueかfalseどちらかの値しか持つことができず、数値演算はできません。よってAはOKですがBはエラーです。
char型は1文字分を記憶できますが、それを整数値として演算に使うことができます。よってC、DはOKです。Eはint型の定数を代入していますが、定数に限り拡大変換でなくても大丈夫です。(
→2.演算子と制御文 問題10)
ではFはどうでしょう。この規則から行くと大丈夫そうです。ところが
問題3でやったように、char型は0以上2
16−1以下の整数値しか扱えないので、この範囲外の値は定数でも代入できません。よってFはエラーになります。
解答 A C D E
整数の定数として下から正しいものを選び、それがbyte、short、int、longのどの型になるか答えよ。
A: 123456789012345
B: 3.2
C: 0xABCD
D: 038
E: 0x33L
F: 55555L
|
解説
整数の定数はint型とlong型のものがあります。byte型、short型の定数はありません。
int型の定数にはどんなものがあるか見てみましょう。
まずおなじみの10進数。「12」や「−345」などです。ではAはOKでしょうか。実はint型の表現できる値の範囲(
→問題3)を超える値は、定数としてもコンパイルエラーになります。int型はだいたい21億くらいまでしか入りませんので、123兆などという値はいけません。よってAは×。また小数点つきだとdouble型の定数と見なされるので、Bも×。
次に8進数。「0」から始まるものは8進数と見なされます。例えば「0432」は
4×8
2+3×8
1+2×8
0=4×64+3×8+2×1=282
で10進数の282のことです。8進数ですからもちろん各桁は0から7の範囲になければならないのですが、Dは8が使われていて、やはりコンパイルエラーになります。
最後に16進数。「0x」または「0X」から始まるものは16進数と見なされます。例えば「0x12B」は
1×16
2+2×16
1+B×16
0=1×256+2×16+11×1=299
で10進数の299のことです。16進数ですから10から15までの桁はアルファベットの「a〜f」または「A〜F」で表します。Bは11になります。Cは問題ありません。値は43981になります。時間があれば確かめてください。
では次はlong型の定数です。int型の定数にアルファベットのエル、「l」または「L」をつけたものになります。よってEやFはlong型の定数になります。もちろんlong型の範囲に値が入らなければコンパイルエラーになります。もうひとつ注意点として、小文字のエル「l」は数字のイチや縦棒とまぎらわしいので、大文字のエル「L」を使用してください。
解答 C int型 E long型 F long型
浮動小数点の定数として下から正しいものを選び、それがfloat、doubleのどちらの型になるか答えよ。
A: 4.1F
B: 6e3
C: .12
D: 15.
E: 6e3f
F: 0.12e1024
|
解説
浮動小数点の定数はfloat型とdouble型のものがあります。
double型の定数にはどんなものがあるか見てみましょう。
まず小数点つきの指数部なし。「12.5」や「−34.2」です。では15をdouble型の定数にするにはどうすればいいでしょうか。そのまま「15」ではint型の定数になります。そこで小数点をつけて「15.0」とすればOKです。小数点以下が0の場合、その0は省略でき「15.」とできます。よってDはdouble型の定数になります。また整数部が0の0.12などの0も省略でき「.12」とできます。よってCもdouble型の定数。
次は指数部付きのもの。とても大きい数値あるいは小さい数値、例えば1230000000000.0や−3456000000000000000.0、あるいは0にとても近い数値、例えば0.0000000000000123などは、×10の何乗という形で表すのが普通です。それをそのまま定数で指定できるように、指数部付きの定数があります。アルファベットのイー、「e」または「E」の後ろに何乗の部分を指定します。
1230000000000.0 = 123×10
10 → 123e10
−3456000000000000000.0 = −3456×10
15 → −3456e15
0.0000000000000123 = 123×10
−16 → 123e−16
ここで例えば123×10
10は1.23×10
12でもあります。つまり123e10は1.23e12と同じ数値を表します。Bは6×10
3=6000をdouble型の定数で表したものになります。「6000.0」と同じです。ではFは0.12×10
1024でOkでしょうか。いいえ、これはdouble型で表すことのできる範囲を超えているので、コンパイルエラーになります(
→問題4)
次はfloat型の定数です。double型の定数にアルファベットのエフ、「f」または「F」をつけたものになります。よってAやEはfloat型の定数になります。もちろんfloat型の範囲に値が入らなければコンパイルエラーになります。
解答 A float型 B double型 C double型 D double型 E float型