入門じゃないJava(1)

こんにちは。

いつもより早めの書き出しです。(何時くらいに投稿できるかは未知数ですが。)

今日はJavaを見ていこうと思います。

なお、3言語覚えなおし企画なので、ちょっと内容がふらついてしまうのはご容赦ください。

今まではちょっとだけPythonをこのブログで取り上げたほかArduinoなんかもやりましたね。

あと一つか二つくらいやりたいんですけど。。。どうでしょうか?

何がともあれ、ゆるゆると進めていきます。

 

数値リテラル

特にJavaに限った話ではないですが数値リテラルから見ていこうと思います。

我々が普段利用しているのは10進数で、物を数える時にあまり2進を使っている方は見かけません。

ちょろっと出てきましたが、物を数える時などに使うものの中には0から9を使って数える10進数(普通の数え方)のほかにも0と1を使った2進数や0から7を使った8進数、0からFを使った16進数...とさまざまあります。

これらのうち数値リテラルとしては、10進数や8進数、16進数などがあります。

さらに、それぞれ型がint型とlong型の2種類があるので、数値リテラルの種類は6種類ということになりますね。

 

ひとまず、int型とlong型はいいとして、10進数、8進数、16進数を詳しく見てみましょう。

まずは10進数から見ていきましょう。

10進数

 10進数は0 1 2 3 4 5 6 7 8 9の10種類の数字を使って数を表現します。

0から9までを使い切ると桁が繰り上がって10となります。

2桁の数の誕生です。この「2桁」は10から始まって99までの数です。

そして、100になる。この100は「3桁」ですね。

そのため、これは

 1桁 : 0から9までの10種類

~2桁 : 0から99までの100種類

~3桁 : 0から999までの100種類

~n桁 : 0から10^n-1までの10^n種類

ということになりますね

10進数の各桁は下から順に10^0, 10^1, 10^2, 10^3...と10のべき乗の重みをもちます。

なので、1234は、

    1234 = 1 * 10^3 + 2 * 10^2 + 3 * 10^1 + 4 *10^0

と解釈できます。

なお、10^0は1です。仮に2^0でも, 8^0でも, 16^0でも1になります。

 

8進数

8進数は0 1 2 3 4 5 6 7の8種類の数字を使って数を表現します。

0から7までを使い切ると桁が繰り上がって10となります。

10の次は11,12...となります。

2桁の数の誕生です。この「2桁」は10から始まって77までの数です。

そして、100になる。この100は「3桁」ですね。

そのため、これは

 1桁 : 0から7までの8種類

~2桁 : 0から77までの64種類

~3桁 : 0から777までの512種類

になります。

8進数の各桁は下から順に8^0, 8^1, 8^2, 8^3...と8のべき乗の重みをもちます。

たとえば、4451(整数リテラルでは04451と表記)は

    4451 = 4 * 8^3 + 4 * 8^2 + 5 * 8^1 + 1 * 8^0

と解釈できます。(10進数で表すと2345)

 

16進数

16進数は0 1 2 3 4 5 6 7 8 9 A B C D E Fの15種類の数字を使って数を表現します。

0からFまでを使い切ると桁が繰り上がって10となります。

10の次は11,12...となります。

なお、16進数のAは10進数の10に対応します。

なので、16進数は10進数の0~15までとなりますね。

2桁の数の誕生です。この「2桁」は10から始まってFFまでの数です。

そして、100になる。この100は「3桁」ですね。

そのため、これは

  1桁 : 0からFまでの16種類

~2桁 : 0からFFまでの256種類

~3桁 : 0から777までの4096種類

になります。

16進数の各桁は下から順に16^0, 16^1, 16^2, 16^3...と16のべき乗の重みをもちます。

たとえば、4451(整数リテラルでは04451と表記)は

    1ED2 = 1 * 16^3 + 14 * 16^2 + 13 * 16^1 + 2 * 16^0

と解釈できます。(10進数で表すと7890)

 

整数接尾語

整数リテラルにはint型とlong型があると書きましたが、基本的にint型になります。

しかし、整数接尾語のLまたはl(小文字のエル)をつけるとその整数リテラルはlong型になります。

ちなみに、lと1は見分けがつきにくいためLを使うことを推奨します。

たとえば、12はint型ですが、12Lはlong型と解釈されます。

 

次は各整数値リテラルを見てみましょう。

10進整数リテラル

 日常生活で一般に使うような数、12や24などの10進数で表すような数は10進整数リテラルと呼びます。

8進整数リテラル

 8進整数リテラルは10進数と区別がつくように先頭に0をつけて表記します。

024 ・・・  8進整数リテラル(10進数で30)

  24 ・・・ 10進リテラル(10進数で24)

16進整数リテラル

  16進整数リテラルは先頭に0xまたは0Xを付けます。

なんかかっこいいですね。

続くA~Fのアルファベットは大文字小文字どちらでも大丈夫です。

0xE  ・・・ 16進整数リテラル(10進数で14)

0x12 ・・・16進整数リテラル(10進数で18)

class DispIntegerLiterals{
    public static void main(String[] args){
        int a = 12;
        int b = 012;
        int c = 0x12;

        System.out.println("10進数 a = " + a);
        System.out.println(" 8進数 b = " + b);
        System.out.println("16進数 c = " + c);
        
        //printfメソッドで書式文字列を使うと簡単に8、16進数の表示が行えます。
        
        System.out.printf("10進数でaを表示すると%d\n", a);
        System.out.printf(" 8進数でaを表示すると%o\n", b);
        System.out.printf("16進数でaを表示すると%X\n", c);
    }
}
ちなみに、%Xを%xにするとアルファベットA~Fが小文字になります。

 

今日はここまでにしましょうかね。

あまりJavaらしく内容ではなかったですが・・・

明日はどんな記事を書くかわかりませんが、ぜひご覧いただければと思います。

参考文献

柴田 望洋 (2016) .『新・明解Java入門』146-149

 

2017年9月28日: 文章の一部に壮大なミスを発見したため修正しました。

2017年9月28日: プログラムに一部ミスがありましたので修正しました。

2018年3月20日: 16進数の各桁の重みについての説明に誤りがありました。