プログラミングの授業のTAをこっそりやっています。
まともにC言語に関わったのは久し振り。
本日のテーマは、「int型の変数に代入できる最大の数は何か?」という課題です。
もし、暇だったら考えてみてください。
普通の課題では満足しない人のための課題なのだけど、面白い回答があったのでこっそり紹介します。
まずは自分で作ったプログラム。
読めるものなら読んでみろ!
#includemain(){ int before, after = 0; while( (before = after) < ++after); printf("max: %d\n", before);}
実行すれば、2147483647という出力が得られます。
考え方がシンプルなだけに、型をchar等に変えるだけで、他の型の最大値も得られます。
ここからは2年生の回答。
まずは「良く知ってるなー」という回答。
#include#include main(){ printf("max: %d\n", INT_MAX);}
limits.hというヘッダに、この課題の答えが書かれているらしい!
実際にそのヘッダファイルを探して開いてみると。
/* Minimum and maximum values a `signed int' can hold. */# define INT_MIN (-INT_MAX - 1)# define INT_MAX 2147483647
これを知っているということは、きっと使っているということで。
つまり、intの桁あふれに注意しながらプログラムしているということでしょう。
素晴らしい。
続いて、「これ動くんだ?」というプログラム。
#includemain(){ int max; scanf("%d", &max); printf("max: %d\n", max);}
これは実行しただけで答えが得られるわけではないです。
実行すると入力を求められるので、テキトーに大きい数字(例えば10000000000000)を入力します。
それをmaxという変数に代入して、表示しているだけ。
これが不思議と、2147483647という出力をするんです。
もちろん、100とかっていう小さい入力ではダメです。
2147483647以上の大きな数字を入力すると、オーバーした分は綺麗に切り捨てられるというわけ。
これはscanfを通しているおかげだと思いますが、scanfの方は残念ながらソースが見つけられず。
たぶんコンパイル済みなのでローカルを探しても出てこないんでしょう。
あと、int型が4バイトで符号付きの型であることから、2の31乗の周辺の値を実際にprintfさせてみて境界値を探している学生もいました。
先生としては一番ほっとする回答だと思います。
みんな優秀だなー。
勉強になるなー。
コメント