コンピュータの内部表現において最上位ビットに1が立つと、いろんな場合に例外が発生します。
一番簡単な例では、ほとんどのコンピューター言語(Java、C++、etc)でサポートされている4byte整数があります。
4byte整数なので、4×8=32bitで数値を表すわけですが、この最上位ビットが1のときは負数、0のときは正数になります。
2進表現で0を32個も記述するのは冗長なので16個(16bit=2byte)で説明することにします。(2byte整数で説明しますが、4byte整数でも同じことが発生します。)
2進表現で、0000 0000 0000 0000から1ずつ増やしていくと、最上位ビットが1になった瞬間に10進表現の正負が逆転して、正の最大値から負の最大値となります。
2進表現
|
10進表現
|
0000 0000 0000 0000
|
0
|
0000 0000 0000 0001
|
1
|
0000 0000 0000 0010
|
2
|
:
|
:
|
0111 1111 1111 1110
|
32766
|
0111 1111 1111 1111
|
32767
|
1000 0000 0000 0000
|
-32768
|
1000 0000 0000 0001
|
-32767
|
1000 0000 0000 0010
|
-32766
|
:
|
:
|
1111 1111 1111 1110
|
-2
|
1111 1111 1111 1111
|
-1
|
覚えておいて欲しいのは、多くの処理系(言語とかOS)で、正の最大値(32767)に1を加えると、エラーもワーニングも発生せずに負の最大値
(-32768)に値が変わるということです。(一般にラップアラウンド:wrap
aroundといいます。)私が過去に対応したシステムでも4byte整数(Integer)でラップアラウンドが発生していたのを数年にわたって気付かず、発覚後に大問題になったことがありました。
正確なところが知りたい人は、「二の補数」でググってみてください。