Variable には size の問題があります。
これは contents 「II 準備[ 知識 ]」編の complement で詳しくやりました。
それを program 上で確かめます。
自分の環境でわからない場合はこの sample を実行してみましょう。
#include <iostream.h>
int main()
{
cout << "short : " << sizeof(short) << endl ;
cout << "int : " << sizeof(int) << endl ;
cout << "float : " << sizeof(float) << endl ;
cout << "double : " << sizeof(double) << endl ;
cout << "long double : " << sizeof(long double) << endl ;
cout << "char : " << sizeof(char) << endl ;
return 0 ;
}
|
通常、int, short や float, double, long double などの数値を扱う変数は宣言されると符号付きで扱います。
short は私の環境では 2 byte でした。
2 byte の容量で表せる数値は -32,768 〜 32,767 の数値です。
という事は、整数 literal 値で 32767 よりも大きい値を代入したらどうなるのでしょう。
#include <iostream.h>
int main()
{
short i ;
i = 32767 ;
cout << i << endl ;
i = 32768 ;
cout << i << endl ;
i = 65535 ;
cout << i << endl ;
return 0 ;
}
|
実行結果です。
予想通りの結果になったでしょうか。
つまり、program 上で計算するには必ず Variable の容量を考慮しなければならない事になります。
short で宣言した場合 正の数は 32767 以上大きい数値を扱わない条件が必要になるのです。
例えば学校の3年2組の生徒の平均は毎年 30 人〜 40 人多くても 50 人はいかないという前提があるならば short を採用すべきです。
しかし、この前提を忘却し、この program source を使いまわしで 街の人口を short に格納したとします。
そこに省略された街の人口は 30000 人〜多くて 40000 人。多くても 45000 人はいかないという前提だったとしたら。
32767 人の人口を越えた時点で、その program (soft)は data が minus 値などの誤差でめちゃくちゃになってしまいます。
こういった bug は非常に厄介です。
つまり 32767 人の人口を越えるまで bug は発生する事なく何年でも潜んでいるからです。
まさしく、恐ろしい地雷でしょう。
扱っている人からみれば、何年も安定していた computer がある時期に暴走したと考えるかもしれません。
一応 sample の説明をしておきます。
私の環境の場合 short は 2 byte ですから -32768 〜 32767 までの数値を扱う事になります。
これは 2 byte は 16 bit ですから
正の数の最大値は (2 の 16 乗) / 2 - 1 = 65536 / 2 - 1 = 32768 - 1 = 32767
負の数の最大値は (2 の 16 乗) / 2 = 65536 / 2 = 32768 だから -32768
になります。
この詳細は "II 準備[ 知識 ]" の "complement 二進数" の項目を参照してください。
まず 整数literal である 十進数表記 32768 は二進数表記で 1000 0000 0000 0000 です。
符号付き variable での十進数表記 -32768 はどうでしょうか。
十進数表記 -32768 は 32768 をComplement を用いた負数の表現にします。
十進数表記 32768 は二進数表記で 1000 0000 0000 0000 でした。
これを bit 反転させると 0111 1111 1111 1111 になります。
補数の 1 を加算すると 1000 0000 0000 0000 になります。
つまり 整数 literal 32768 (1000 0000 0000 0000) は符号付き variable では -32768 と解釈されてしまいます。
また整数 literal で十進数表記 65535 は二進数表記で 1111 1111 1111 1111。
符号付き variable で十進数表記 -1 の表現を二進数で表現してみます。
十進数表記 -1 は 1 を complement を用いて負数表現にします。
十進数表記 1 は 二進数表記で 2 byte size で 0000 0000 0000 0001。
bit 反転すると 1111 1111 1111 1110 に complement の 1 を加算して 1111 1111 1111 1111 になります。
つまり 整数 literal 65535 (1111 1111 1111 1111) は符号付き variable では -1 と解釈されてしまいます。