駅の電光掲示板「32768両編成」の原因について一考

大学の数値解析の期末試験で、図のようなエラーの原因を考察せよという問題があった。分からなかったので調べ、自分なりに分かりやすく説明してみた。学科は情報系でもなく素人なので、用語や理屈に誤りがある可能性大。あまり信用はしない方がいい。 自分用に作ったものだが、他の方の助けにもなれば幸甚。
2
ウィンドミルン @subitoshi

結局数値解析のテストで出た、駅の電光掲示板の「32768両編成」ってエラーは何が原因だったのか

2014-08-03 11:09:51
ウィンドミルン @subitoshi

ちなみに問題文に載せられた画像は多分これ(問題用紙に直接回答して提出するタイプだったから手元にない) pic.twitter.com/i2JCH90CwA

2014-08-03 12:12:49
拡大
ウィンドミルン @subitoshi

short型の最小値が-32768で、これの符号が取れて表示されたって言っても、なぜ-32768なんて値を入力したのか

2014-08-03 11:14:43
ウィンドミルン @subitoshi

メモリに直接0と記憶させるわけ無いし

2014-08-03 11:15:23
ウィンドミルン @subitoshi

一番説得力があると思ったのは、入力する側の整数型と、受け取って出力する側の整数型のビット幅が違ったって説かな

2014-08-03 11:26:56
ウィンドミルン @subitoshi

憶測に憶測を重ねてるからなんとも言えないけど、こんな感じだと納得できる。 1.入力する側のプログラムは、両数を記憶するのにshort型を使っている。 2.混乱していて次に何両編成の電車が来るか分からないから、とりあえず両数に「-」と入力しておいた。

2014-08-03 11:33:18
ウィンドミルン @subitoshi

3.入力側プログラムは「-」という入力を「-0」(10進数)だと捉え、先頭の符号記憶ビットに1を、残りの数値記憶ビットに000000000000000を、結局全体として「1000000000000000」(2進数)という値を記憶した。

2014-08-03 11:40:57
ウィンドミルン @subitoshi

4.「1000000000000000」(2進数)というデータが出力側に送られる。 5.出力する側のプログラムは、両数を記憶するのにint型を使っている。

2014-08-03 11:45:20
ウィンドミルン @subitoshi

6.送られてきたshort型の「1000000000000000」(2進数)というデータを、int型の「00000000000000001000000000000000」(2進数)というデータに変換した。これは、int型ではちょうど2^15=「32768」(10進数)を表す。

2014-08-03 11:48:54
ウィンドミルン @subitoshi

7.出力する側のプログラムはこれを表示させ、電光掲示板には「32768両」と表示された。

2014-08-03 11:49:55
ウィンドミルン @subitoshi

これはネット上で見つけた説に自分なりの解釈を加えて、自分にとって分かりやすく書きなおしたものです。

2014-08-03 11:52:15
ウィンドミルン @subitoshi

アカウントが無くなっててRTできないからコピペしときます。

2014-08-03 11:52:39
ウィンドミルン @subitoshi

職員「運用乱れて両数不明だから"-両編成"って出しとけばいいか」→「-」と入力→入力を受け付けたプログラム「"-"ってことは"-0"か。マイナスは頭のビットを1にすればいいんだよね。"1000000000000000"と」→続く — Shun1さん (@Nukashi_ALL)

2014-08-03 11:53:40
ウィンドミルン @subitoshi

→表示機のプログラム「マイナスxx両なんてありえないから俺は16ビットを正の数として読み込むぜ。"1000000000000000"ってことは十進数に直すと32768だな。わかった。"32768両編成"って出すぜ」 — Shun1さん (@Nukashi_ALL)

2014-08-03 11:54:08