min117の日記

初期desireもち。趣味Mac,メインFedora,仕事xp。

独習Java第4版 int i = 258 のあと b = (byte)i としたら bは何を表示するか → 答えは 2(32bit符号付き整数の下位8bitだから)

Java楽しい。

f:id:min117:20200115074809j:plain

この本は「独習」と言いながら全く初心者向けではなく、とても不親切な説明なんだけど、別の言語を触ってプログラムに書き慣れてから見直すと著者の言わんとしていること説明したい順番が分かって楽しい。

 

例えばこのページ。
f:id:min117:20200118091215j:plain

下位8ビットだけが変数bに代入されます」なんていきなり出てきて理解できる独習者なんてそういないと思う

 

意味ワカランので、まずは本のとおり書いて動かしてみる。

やれることからやる。手を動かす。コレ大事。

 

$ vim NarrowingConversion.java

f:id:min117:20200118091815p:plain

f:id:min117:20200118092003p:plain

 

javac NarrowingConversion.java

$ java NarrowingConversion

f:id:min117:20200118092113p:plain

たしかに2が出る。なんでだ。

 

 

 

答えはここにあった。

f:id:min117:20200118092541p:plain

Javaint32ビット符号付き整数

 

そこで、このソースの7行目にある

f:id:min117:20200118092003p:plain

10進数の258」を32ビット符号付き整数にしてみる。このサイトを使う。

note.cman.jp

 

「10進数」「符号付き」「32bit」の258は、2進数にすると

f:id:min117:20200118092923p:plain

0000 0000 0000 0000 0000 0001 0000 0010

となる。

 

これの下位の8ビットだけ b = (byte)i; によって変数bに代入されるわけだから

f:id:min117:20200118093351p:plain

 

0000 0000 0000 0000 0000 0001 0000 0010

2進数の「0000 0010」だけが変数bに入る。

 

10進数に直すと「2」

f:id:min117:20200118093827p:plain

なるほど。2となるわけだ。

f:id:min117:20200118092113p:plain

 

ちなみになぜ8ビットだけなのか?それは(Javaでは)byteは8ビット符号付き整数だから

f:id:min117:20200118094216p:plain

 

「変数と代入」なんて

f:id:min117:20200118094004p:plain

どの言語でも同じだろうと読み飛ばしていたけど、実は32ビット符号付き整数すら正確に理解していなかったわけだ。反省。

 

Java面白い。独習本で基本的なところからやり直すのも。最高に面白い。

 

追記)この計算サイトほんと便利だな。10進数から2進数への変換とか、とても丁寧で分かりやすい。

f:id:min117:20200118095541p:plain