3-1 整数
3-1-2 ビット長と値の範囲
5つの整数型のそれぞれに割り当てられているビット長が違うので扱える値の範囲が違うというお話。
プログラミング言語が、内部表現を隠蔽して整数型として10進数で使えているということは常に意識しておかないといけない。このあたりの内部表現は、「コンピュータはなぜ動くのか」が理解の手助けになっているかも。
3-1-4 リテラル表記
2進数表記がJava7で加わったのは知っていたけど、アンダースコアで区切りを表現できるのはつい最近まで知らなかった。
たまに2進数で考えたいことがあるのでそれなりに使っている。読む人にとっても、ビット演算などのために使う変数とわかるのでありがたい。
n = 0b11111111
n = 0b_1111_1111
3-1-5 文字と数値
Javaの文字は内部的には数値というお話。基本的に、Javaでは文字を文字列として扱うけど、速度を出したいときなどは文字配列として扱うことがあり、そのときにこのあたりの考え方が生きている気がする。
3-1-7 整数型の使い分けの指針
- byte、char型
小さな整数型としても使えるが、それぞれバイトおよび文字としての意味に限定して使うべき。 - short、int、long型
「どれでもいいならばint型を使う」。int型のみアトミック性を保証しているのは知らなかった。ただ、ここまで64bit0Sが主流になってくると、long型でもパフォーマンスをそれほど気にしなくてもいい気がする。
short型は、16ビット長に意味がある場合のみ(ex.TCP/IPの世界ののポート番号)。
3-2 整数の演算
基本的な演算子についての説明。
3-3 型変換
このあたりの厳密な型がJavaの好きなところ。自分はそれほど苦労しなかったけど、型が曖昧な言語でプログラミングを覚えた人は苦労するのかな?
3-3-2 キャスト
キャストのビット切り捨て動作の説明もある。基本的に、キャストが多い時は設計が悪いときがほとんどなので、設計から見直すべき。
3-4 ブーリアン(真偽値)
3-4-1 ブーリアン型
ブーリアン型の説明。変数に直接ブーリアンを代入するフラグ変数の多用は避けるべき。自分はフラグ変数をよく使ってしまいます。。。(このあたりはオブジェクト指向でプログラムを覚えたのではないくせが残っているのかも)
ifの条件式でtrue/falseと比較してるクソコードもたまに見る。
if (contains("foo bar", "bar") == true){
// hoge
}
3-4-2 ブーリアン型の注意点
ブーリアン型にまつわるバグは意外に多い。それを避ける1つの指針は、否定演算子をなくすこと。
if (!Character.isDigit(c) && !Character.isLetter(c)) {
System.out.printlne("any symbol?");
}
↓否定演算子の除去
if (Character.isDigit(c) && Character.isLetter(c)) {
; // through
} else {
System.out.printlne("any symbol?");
}
個人的には読みやすくなったとは感じないが。。。いずれにしろ、テストコードで、すべての分岐を網羅しておくべき。テストコードを書かない人がまだまだ多い。