自然数、ゼロ、整数

データ実体が同じでも属性が違うと数値が変わる
数の概念
複素数実数有理数整数自然数\( 1,\ 2,\ 3 \)
ゼロ\( 0 \)
負の整数\( -1,\ -2,\ -3 \)
有限小数分数\( 0.5,\ \displaystyle \frac{3}{4} \)
循環小数\( \displaystyle \frac{1}{4} \)
無理数無限小数\( \sqrt{2},\ \pi,\ \log{2} \)
虚数\( 3i,\ -5i \)
データは、コンピュータ内部で2進数で保管・処理されるが、2進数10000001は、符号無し整数では129を、符号つき整数では-127をあらわす。データ実体が同じでもデータ属性が違うと、あらわす数が違うので注意が必要だ。

デジタル回路

オシロスコープ
データ実体は「デジタル値として保管・処理される」と定義したが、現在のデジタル・コンピュータは、デジタル値のうち、0と1の、わずか2値を同時に保管・処理する。
実際には回路上を流れる電圧の差異であらわされる。一般的には、+5Vを1、0Vを0として扱うのだが、省電力型の回路では+5V以下の場合もある。
なお、研究が進んでいる量子コンピュータは、電圧ではなく量子ゲートを用いるものが主流で、これが実現されれば、2値ではなく、2n種類の値を同時に扱うことができるようになる。

ゼロと自然数

2進数
話を戻そう。
データ実体が2値であるということは、すべてのデータを2進数に置き換えることができるということだ。中学の数学で記数法の変換(N進法変換)を学んだと思うが、その知識を役立ててほしい。
たとえば、10進数の整数100の実体は2進数1100100、123456の実体は11110001001000000である。
2進数の1桁をビットと呼ぶ。ビットは、0または1の数を保持できる。
つまり、10進数の整数100の実体を格納するには7ビット必要で、123456の実体を格納するには17ビットが必要である。
実際のコンピュータでは、CPUの処理能力の関係で、8ビット、16ビット、32ビット、64ビット‥‥という形で、2のべき乗のビット数のデータを一塊として処理する。
8ビットで表現できる整数は2進数00000000~11111111の範囲で、これを10進数に換算すると0~255の範囲となる。
整数のうち、ゼロと自然数の属性を持つデータは、このようにして表現される。

余談だが、ゼロは除数(割る数)にすることができない。
数の概念で紹介したように、自然数とゼロは別物であるという意識を持っておくと、ゼロ除算を回避する処理を書けるようになるだろう。

負の整数

では、負の整数はどう表すか――原則として、最上位ビットが1であるものは負の整数とみなす。
8ビットだと、2進数00000000~01111111は10進数0~127の範囲となるのは自然数の場合と同じだが、2進数10000000は最上位ビットが1なので負の整数となり、10進数で-128をあらわす。10000001は-127、10000010は-126‥‥となる。
つまり、8ビットで表せる整数の範囲は-128~+127である。

ゼロと自然数の属性を持つデータを符号無し整数、整数の属性を持つデータを符号付き整数と呼ぶことがある。
この2つの属性を明確に区分しておかないと、下表のように、データ実体が同じでも異なる整数を指し示しているから、処理結果が大きく異なることになってしまう。
データ実体(2進数)符号無し整数符号付き整数
0000000000
000000011+1
01111111127+127
10000000128-128
10000001129-126
11111111255-1
プログラミング言語では、データ属性を明示的に表す手段として、型宣言が用意されている。
PHPはバージョン7からスカラー型の指定が可能になり、整数は integer と指定する。C言語では、符号無し整数は unsigned int、符号付き整数は signed int として明確に区別できる。
(この項おわり)
header