いちおくまんえん 2001年4月30日
ようやく帰りました〜。
はい。みなさんおひさしぶりです。
まずはじめに、研修中に見たある本のことについて話したいと思います。
研修場の地下にある紀伊国屋で、おもしろそうな本を見つけました。
有名な映画をボロボロに叩きまくるという本だったのですが、なかなか楽しく読むことができました。
ヘ(。Д、゜)ノ・・・が
こういう本で絶対にやってはいけないことをやっていたんですよ。
これを見た瞬間噴出しそうになりましたよ。( ̄ー ̄)危ない危ない。
そのページではツイスターという竜巻がゴ〜!っという感じの映画のことを叩いてました。
そこに掲載されていたこんな文章。
この映画の制作費は540億兆ドルで
ヘ(。Д、゜)ノ日本の国家予算は軽く上回ってるかと
(((( ;゚Д゚)))すげ〜ぜ。さすがはアメリカだぜ。
ヽ(゜▽、゜)ノいちおくまんえんの上を行く壮大なスケール
日本は億と、萬。アメリカは億と、兆。
ヘ(。Д、゜)ノ控えめな日本人の性格がよく表れてますね
まぁ、ナニワトモアレ。(おぃ)金額として表してみましょう♪
日本円で5,400,000,000,000,000,000,000,000円です♪(*´∇`)ノお〜すげ〜!!
ヘ(。Д、゜)ノ読めん
ていうか、世界中から金が消えるだろ?これ?
たかが竜巻がゴ〜!ってだけの映画に。
ヘ(。Д、゜)ノ60億人で割っても1人頭900兆円なんですが
ヘ(。Д、゜)ノここまで検証させておいてタイプミスだったとしたらオラ、許さねぇ!(それしかねぇよ
世の中には凄まじく変な本があるということを学んだ出来事でした♪(笑
さて、研修で学んだのは実はこんなことではありません。(その方が怖い
まじめにJavaを覚えてきましたよ。ええ。必死で。
ヘ(。Д、゜)ノびっくりするほどスパルタなんですよ
テキストは一日200ページ進むわ、UML知らないのにクラス図とシーケンス図を描けと言われるわ。。。
ヘ(。Д、゜)ノ口から鼻血が出そうでしたよ(ありえねぇ
まぁ、スパルタだったからこそ必死になれた部分がありますが。
自分の口から
『このメソッドをオーバーライドしてHumanクラスのサブクラスであるManクラスで定義します。』
とかいう言葉が出ると思いませんでしたよ。まったく。
ヘ(。Д、゜)ノこれも講師のみなさんのおかげです!!ありがとうございます!!!(何故かヤケクソ
その理由はさておき、最終日には表彰がされました。
最優秀課題提出賞(正確な名前忘れました)、ベストアドバイザ賞、努力賞、優秀賞・・・。
この名前を聞いた時、俺は思いました。
ヘ(。Д、゜)ノベストアドバイザ賞、確実に俺だな
こう思うのには、ちゃんとした理由があるんですよ。
そして、ベストアドバイザ賞の発表です。
ベストアドバイザ賞は。。。
・・・
Do.さん!!
Σ(´□`lll)やっぱりなぁあああ!!
普通は、喜ぶところです。
しかし、俺は苦笑いしてました。周囲の人も、苦笑いしてました。
講師の方に近づいていき、『この賞は、君しかいない。』と言われました。
実は、その前に一言二言あるんですよ。それは。。。
自分の課題を放り出して自分のグループのみならず
他のグループの人の課題にも勝手に手を加えていたので『この賞は君しかいない』と思いました
Σ(´□`lll)普通にうれしくねぇええ!!
いや、そんなに好き勝手してたわけじゃないんですよ。
ただ、5グループ中5グループの人のソースを書き変えたかな?と。(全部じゃん
書き換えたといっても、ここはこうするんですよ。って教えただけなんだけど。あれ?あれ???
ヘ(。Д、゜)ノもういいや
とにかく、微妙な心境で賞をいただきました!終わり!!(なんだこりゃ?(笑
・・・こんなんで終わったらホントに何をしてきたのかわからないので
ほんの少しプログラミングのことを話します。
題して。。。
VBのちょっとした不思議!(Java受けたのにこれかい
細かいことは気にせずいきましょう♪
ここからはホントにVBの話をしていきます。(こう書かないと信じてもらえなそうで嫌だ(笑
ここを見る人でVBを知らない人は、これ以上読み進める意味が無いと思います。(汁汁
ていうか、多分つまらないですよ。(笑
さて、これから話すことはとても不思議?なことです。
まず、変数を二つ宣言します。
Dim i As Integer
Dim x As Long
そして、以下のようにループで回します。
For i = 0 to 9
x = i * 10000
Next i
Integer型のiと10000をかけてxに足しこむだけ!
(*´∇`)ノこれの結果はみなさんが思っている通りですよ♪
ヘ(。Д、゜)ノオーバーフローします
ここから先を読む前に、一度試してみてください。
ホントにオーバーフローしますから。
ね?なったでしょう。
さて、これは一体どんな理由なのでしょうか?
iは、0から9までしか変化しません。Integerどころか、Byteでもオーバーフローしません。
そしてxはLong型。9*10000でも、Long型では到底オーバーフローしません。
となると、答えは1つ。
10000が原因でオーバーフローするんです
何故?と思う方もいるでしょう。しかし、よく考えてみてください。
10000は確かに数字ですが、プログラム言語には必ず『型』というものが存在します。
文字ならばString型、数値ならInteger、Long、Doubleなどなど。。。
"で囲んだ文字はString型として扱われるのに対し、数値が数字として扱われるのはおかしいと思いませんか?
つまり、10000はInteger型として扱われていたんです
なぜLong型ではないのかと言うと、10000を表現するのにはInteger型で十分だからです。
さて、ここで改めて実際の計算を見てみます。
x = i * 10000
xはLong型ですが、iと10000はInteger型です。
これはJavaで習ったことなんですが、int型(VBでいうLong型)とShort型(VBでいうInteger型)で計算したときに、
int型は4バイトなので、Short型の数値をすべて格納することができます。
しかし、2バイトであるShort型の中に4バイトであるint型の数値を格納することはできません。
上の式でも同じことが言えます。
もしも10000がLong型なら、90000という数値を格納することができます。
違うバイト数の変数で計算すると、大きいバイト数の型に変換(?)されるためです。
しかし、上の式ではInteger型×Integer型です。
9*10000の計算結果はLong型になります。
しかし今ある変数はInteger型なので、値を格納しきれずオーバーフローしていたということなのです。
式の右側でオーバーフローしているので、xがいくらLong型で宣言してあるといっても関係はありません。
さてこれで理由はわかりましたが、これを回避する方法はあるのでしょうか?
(*´∇`)ノ実は、あります
10000がInteger型として扱われると言うならば、
10000をLong型として扱ってもらうしかありませんよね。
どうやって型を変換するのかというと。。。
i * 10000&
10000の後ろに&をつけてやる。これだけで10000はLong型として扱ってくれます。
この&は数値をLong型として宣言しています。
ちなみに%をつけるとInteger型になります。
まぁ、&や%を使う機会なんてめったにないでしょうけどね。
Σ(´□`lll)・・・ってそれじゃ意味ね〜じゃん!!!
み、みなさぁ〜ん!数字の後には必ず&をつけましょうね〜!!(メモリ無駄に使いすぎ(笑
Back