入門じゃないJava(2)

こんにちは。

今日も楽しくJavaを見ていきましょう。

前回は整数など(10進数、8進数、16進数とint型、long型)を見ていきました。

creators.hateblo.jp

 

ということは、今日は「浮動小数点数?!」とピンときた方、鋭いですね。

浮動小数点数をちょこっとやった後、もう少し進んでみたいと思います。

でもまずは2の補数表現から見ていきましょう。

 

整数の内部と2の補数表現

前回のどのリテラルも値はビットの並びとして表現されます。

かと言って、それらは好き勝手に並んでいるわけでなく、すべてきちんと規則があります。

整数リテラルはint型long型ですが、それぞれ、表現できる最大と最小があります。

その為、表現できる数は有限という訳です。

int型よりもlong型の方が表せる数の幅は広くなっています。

なぜ、int型とlong型にはそのような差があるかというと、構成ビットが違うからです。

具体的には、int型が32ビットに対して、long型は64ビットです。

ということは、int型のオブジェクトを一つ表す為には0と1が32個用意されていることになります。

そのうち先頭のビットは「符号ビット」として使われます。

もしも先頭のビットが0であれば、その値は0か正の数になるはずで、1であれば負の数になります。

具体的に見てみると、

int型の12という数は、 00000000000000000000000000001100と表現されます。

int型の-12という数は、11111111111111111111111111110010と表現される訳です。

ちなみに、先頭の0が太文字になっていると思いますが、これが符号ビットです。

ここで、↑の12と-12を表しているビットに注目していただきたいのですが、まずは12の方は、10進数の12は2進数では1100になりますので、先頭から1100までの上位ビットは0で埋めたものになります。対して、-12は12の補数(ビットの反転)になっている・・・と言いたいところですが、末尾がおかしいですね。

2の補数表現

負の数は正の数の全ビットを反転させたものに1を加えたビット構成になります。

この作業の名前が「2の補数表現」になります。なお、正の数の全ビットを反転させた(もの)のことを「1の補数」と言います。

浮動小数点数

小数点以下の部分を持つ実数を表すのが浮動小数点型です。

これには、floatとdoubleの2種類があります。

ただし、浮動小数点数の場合、整数型よりも厄介な問題があります。

class DispFloatingLiterals {
    public static void main(String[] args) {
        float  a = 123456789;
        double b = 1234567890123456789L;
        System.out.println("a = " + a);
        System.out.println("b = " + b);
    }
}

実行結果

 a = 1.23456782E8
 b = 1.23456789012345677E18

C:\Users\Onwer\Documents>_

 のようになると思います。

※表示されているEは10のべき乗を表す数学的表記。aの1.23456782E8は1.23456782 * 10^8であることを示しています。

なお、1.23456782 * 10^8の1.23456782は仮数、10^8の8を指数と呼び、仮数の桁数が精度を、指数の値が大きさに相当します。

 

見ての通り、変数に入れた値は正確には表現させれていないことがわかります。

これは、浮動小数点型の表現範囲が大きさと精度の両面から制約を受けているためです。

 

浮動小数点接尾語

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

しかし、浮動小数点接尾語であるFまたはf(小文字のエフ)をつけるとその浮動小数リテラルはfloat型になります。

double型と明示したいときなどにはDまたはdを指定します。

たとえば、12.0、12.0Dはdouble型ですが、12.0Fはfloat型と解釈されます。

 

数学的表記と省略

 実は指数を付けた数学的表記や整数部、小数部の省略が可能です。

ただし、いくつかの規則等もありますので、確認しながら見ていきましょう。

class DispSomeFloating {
    public static void main(String[] args) {
        
        System.out.println("1.23E4   =   " + 1.23E4); //1.23 * 10^4
        System.out.println("80.0E-5  =   " + 80.0E-5);//80.0 * 10^-5

        System.out.println(".5       =   " + .5);     //0.5
        System.out.println("5.       =   " + 5.);     //10.0
        System.out.println(".5f      =   " + .5f);    //floatの0.5
        System.out.println("5D       =   " + 5D);     //5.0
    }
}

実行結果

1.23E4   = 12300.0
1.23E4 = 12300.0
80.0E-5 = 8.0E-4
.5 = 0.5
5. = 5.0
.5f = 0.5
5D = 5.0
C:\Users\Onwer\Documents>_

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

次回はもう少し踏み込んだ内容にしていきたいと思います。

では次回もお楽しみに!

参考文献

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

 

 

 

入門じゃない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進数の各桁の重みについての説明に誤りがありました。

 

 

寝る宣言

こんばんは。

ばたばたのかぼすです。

 

前々からなんとなく匂わせていたように、4日くらい前から、超絶バタついております。

もちろん、前々から少しずつ準備をしていれば、ここに来てバタバタすることなんてなかったんですけどね。

 

そんなこんなで、手抜きの記事が続いておりますが5月になれば多少はまともな記事が書けるかなぁと思っております。

 

では。

おやすみなさい!

撃沈

こんばんは。

・・・のかぼすです。

 

一昨日からの頭痛はいまだに継続されていて、今日の午後からの用事にも半ば敗北を味わう結果に。

朝からの考え事も重なり、なんだかちょっと鬱々した日でした。

 

では!

 

どのみち考えるかぼす

こんばんは!

頭痛が痛いかぼすです。

 

いやー朝から頭が痛くてですね。

ズーン、ズーンっていう痛みが右前頭部を襲うわけですよ。

困りました。

 

少し考えてみると最近はちょっと鬱々とした記事が多いような気がしますが、そんなに落ち込んでいるわけではないので、ご心配なく!

 

以上かぼすの近況でした!