昨日の夜に Java.
Object の clone メソッドのオーバーライドが分からない.
朝はハンドルにテープ巻き.
そのあと自転車で遠乗り.
足洗潟公園まで往復(計30km).
もうちょっと走るつもりだったけど,昨日の疲れが出た模様.
クランクの左側(ギヤが付いてない方)の根元がガタツク.
ボールベアリングが逝っちゃってるかも.
今日のツボ:本格的なデカいチーズ (うーさーのその日暮らし No.469)
暑いとドライカレーが美味しいと思った.
またビールも美味しいと思った.
結城浩 Java言語プログラミングレッスン 上巻
基礎から勉強するために上巻も買いました.
かなーり独学でやってきたので,けっこう知らないことが多かったり.
実は,言語をきちんと勉強するのって始めてですだよ.
Basic はベーマガで覚えた感がつよいです.
VisualBasic や StarBasic も適当に覚えてたしなぁ.
制御構造で「if が while のループを1回に制限したもの」という考え方には目から鱗.
「変数」が「変な数」ではないことにも目から鱗(笑.
映画 Final Fantasy はやっぱりお金の掛けどころが間違っていると思た
仕事の帰りにおじさんが「用水で犬を水浴びさせている」さまを目撃.涼しげ~.
なんとなく,エクセル・サーガは第100話で終わりの予感?
今後の予定
8/23 JAVA2 プログラマ認定試験
9/18-21 ツールドのと400
10/17 情報処理技術者試験
やっぱり未定かも
ほうれん草の胡麻和えは定番副菜.
byte 型の最大値はなぜ 127 ?
「byte 型は 8 ビットの符号付整数であり,-128~127 の値をとる.」
ここで,なぜ最大値は “128” ではなくて “127” なのでしょうか?
初心者としてはこういうところが非常に気になります.
そして「これも覚えないといけないのか」と割り切れなさを感じてしまいます.
では,どうして “127” までなのか,について調べてみましょう.
ここで「コンピュータは 2 進数しか扱えない」ことを思い出してください.
つまり,”127″ と 10 進数で表示されている数字も,コンピュータの内部では, 2 進数で処理されているというわけです.
すなわち,byte 型が「8 ビットである」ことは「8 桁の 2 進数で表される」ことに他なりません.
「すると 8 ビットで表されるのは 2^8 = 256 なのでは?」
実は,その通りです.
ほら,「-128~127」は丁度 256 個の数字を表現していますね.
(1~127 で 127個,-1~-128 までで 128個,これに 0 の 1個を足して256個です.)
「それなら,byte 型を -127~128 とした方が,正の数が多くていいんじゃない?」
ところが,必ずしもそうとは限りません.
ここで,「8 桁の 2 進数」がどのように 10 進数に対応しているかを見てみましょう.
まず,「正の数か,負の数か」を表すための符号が必要になります.
これを 8 桁のうちの第1桁目とします.
すなわち,正の数は第1桁目を “0” とし,負の数は第1桁目を “1” とします.
正の数 -> 0xxxxxxx (例えば 00011101 など)
負の数 -> 1xxxxxxx (例えば 10110010 など)
こんな具合です.
そうすると,数字は残りの 7 桁で表すことになります.
10 進数の 0 ~ 127 までは次のように,2 進数と対応します.
2 進数 10 進数
0111 1111 127
… …
0000 0010 2
0000 0001 1
0000 0000 0
ここで,8 桁の 2 進数を 4 桁ごとに区切っていますが,これは見やすくするためです.
これは,綺麗に対応していますね.
では次に,負の数 -128~-1 はどのように対応させているのでしょうか?
「1 桁目が符号(±)を表しているのだから,残りの 7 桁が絶対値を表せばいい」
と考えてみるとどうでしょうか,すなわち,
2 進数 10 進数
1111 1111 -127
… …
1000 0010 -2
1000 0001 -1
1000 0000 -0
アレレ,”-0″ なんてモノができてしまいました.
しかも “-128” がありません.
となると 2 進数の “1000 0000” を 10 進数の “-128” を表すものとしましょう.
これらをまとめると次のようになります.
2 進数 10 進数
0111 1111 127
… …
0000 0010 2
0000 0001 1
0000 0000 0
1000 0001 -1
1000 0010 -2
… …
1111 1111 -127
1000 0000 -128
これは美しくありません.
特に “-128” がリズムを乱していますね.では,どうすればイイのでしょうか?
実際には,負の数は次のように対応付けられています.
2 進数 10 進数
1111 1111 -1
1111 1110 -2
… …
1000 0000 -128
すなわち,8 桁の 2 進数 “128~255” を,10 進数の “-128~-1” に対応させているのです.
正の数とあわせて次のようになります.
2 進数 10 進数
0111 1111 127
… …
0000 0010 2
0000 0001 1
0000 0000 0
1111 1111 -1
1111 1110 -2
… …
1000 0000 -128
このような対応付けには次のような利点があります.
1. 加算が自然である.
例えば,10 進数の “-1 + 3” を見てみましょう.
それぞれ 符号付 2 進数に置き換えて計算すると,次のようになります.
1111 1111
+) 0000 0011
1 0000 0010
ここで,9 桁目は無視されますから,答えは “0000 0010 = 2” となります.
先のもうひとつの対応付けでは,こうはいきません.
特に “-1” と “0” のつながりが自然です.
“1111 1111 = -1” に “1” を加えると, “1 0000 0000” になります.
ここで,9 桁目を無視すれば, “0000 0000 = 0” になるのです.
2. 符号付整数を普通の 8 桁の 2 進数とみても,正の数 “0~127” は変わらない.
これが,正の符号を “0” としている根拠です.
ただし,符号付整数 “-128~-1” は “128~255” になってしまいます.
このように,コンピュータの中では 10 進数は 2 進数に置き換えられ処理されています.
この対応付けから,自然と「byte 型は -128~127 の値をとる.」ことが理解できるかと思います.
更に一歩すすんでみましょう.
「byte 型の取りうる範囲は “-128~127″」でした.すなわち “-2^(8 – 1) ~ 2^(8 – 1) -1” ということになります.
これを一般化すると次のようになります.
「n ビットの符号付整数の取りうる範囲は “-2^(n – 1) ~ 2^(n – 1) -1” である.」
JAVA には次の整数型がありますが,実際に調べてみてはいかがでしょうか.
変数型 bit数 範囲
short 16 -32,768 ~ 32,767
int 32 -2,147,483,648 ~ 2,147,483,647
long 64 -9,223,372,036,854,775,808
~ 9,223,372,036,854,775,807
桁が多くなると,何が何だかわからないので整理すると,
int 32 -2 x 10^9 ~ 2 x 10^9 (= 約20億)
long 64 -9 x 10^18 ~ 9 x 10^18
黙々と暗記するよりも,その理由を知ることが,より深い理解につながるのではないかと思います.
そんなことを思い,この文章を書いてみました.
アイスラッガーを受け損なった某仙人のような断末魔を残して,読子さんはそのまま死んでしまいました(おわり) (c)倉田英之.
読了:倉田英之,R.O.D 外伝 vol.10
田丸浩史「スペース・アルプス伝説」を久しぶりに読んだら,後書きに倉田先生の寄稿が.
こないだウナギを食べる前に,「ニア アンダー7」を読みました.
大切な何かより,ウナギ.
ウナウナ.
職場でノートパソコンのバックライトが逝ったもよう.
しかも,Gateway.
というわけで,17インチCRTをつなげる.
そして,CRTを取られたWindows端末は,私のノートパソコン(私物)から VNC で制御することに.
これで,ディスプレイなし PC が 3 台に...
夜襲の時間が来たので今日はこの辺で(C)ゆうきまさみx田丸浩史
Java まみれっぽい.
この1年で作ったプログラムを整理しつつ,オブジェクト指向の勉強もかねて.
【歯医者】この世から虫歯が無くなる!?【大恐慌】 虫歯,風邪,水虫のいずれかの根本治療法を発見したらノーベル賞と昔は言われていましたが?
エロチック街道経由で.
火消し小町って逢坂さんの?
BSアニメ夜話が9月から?
日記更新スクリプトでLANGを指定して,曜日をロケールで表示にしてみました.