最大値と最小値

32ビットで扱える整数は意外と小さい
コンピュータで表せる数には最小値と最大値がある。演算結果が、最大値を超えたり、最小値を下回る場合はエラー処理が必要だ。32ビットのアプリケーションやライブラリを使っている場合には注意が必要だ。整数として数十億という金額を扱うことができない。

(2024年2月3日)記事「主なプログラミング言語における最大値と最小値」「多倍長整数」を追加

目次

最大値と最小値

Z80 CPU
8ビットであらわせる整数(符号付き)の範囲は-128~+127である。これを超える数を扱うことはできない。
注意が必要なのは演算結果だ。たとえば 120 + 8 = 128 は、足される数も足す数も8ビットであらわせるが、結果の128は8ビットの最大値を超えてしまうことだ。これをオーバーフローと呼び、プログラム側でエラー処理をしなければいけない。
逆に、-120 - 9 = -129 は最小値を下回ってしまう。これをアンダーフローと呼び、同様にプログラム側でエラー処理をする必要がある。
掛け算や割り算では、オーバーフローやアンダーフローが起きやすいので注意が必要だ。
ビット最小値最大値
8-128+127
16-32,768+32,767
32-21億4748万3648+21億4748万3647
64-922京3372兆368億5477万5808-922京3372兆368億5477万5807

32ビットと64ビット

現行のパソコン用OSは64ビット対応しているので、計測・計量可能な数を扱う分には、オーバーフローやアンダーフローが起きることはないだろう。
だが、32ビットのアプリケーションやライブラリを使っている場合には注意が必要だ。21億あまりとなると、大企業の会計処理を行おうとした途端にエラーとなってしまう。
システム開発する前に、利用する処理系で扱える数の最大値/最小値を確認しておこう。

主なプログラミング言語における最大値と最小値

多くのプログラミング言語では、扱える整数の最大値と最小値をシステム定数として用意している。その一覧を掲げる。
言語最小値最大値
JavaScriptNumber.MIN_SAFE_INTEGERNumber.MAX_SAFE_INTEGER
PHPPHP_INT_MINPHP_INT_MAX
C++LLONG_MINLLONG_MAXまたはULLONG_MIN
JavaInteger.MIN_VALUEInteger.MAX_VALUE
Pythonなしsys.maxsize

多倍長整数

上表の Python には最小値がない。じつは、最大値 sys.maxsize は添字などで使える最大値であり、これを超える大きさの整数の演算を行うことができる。
どういうことかというと、Python には多倍長整数ライブラリが内蔵されており、メモリが許す限り巨大な正の整数や負の整数を扱うことができるのである。
この機能を利用したサンプル・プログラムを「PHPとPythonで巨大素数を扱う」で紹介している。

JavaScriptやPHP、C++にも多倍長整数ライブラリが用意されてる。
JavaScript では BigInt型が用意されており、これを適用した定数や変数は上表の制約を受けずに計算ができる。「コラム:BigInt型 - 2.4 数値型の範囲と誤差」をご覧いただきたい。
PHP では GMP関数 が用意されており、これを適用した変数は上表の制約を受けずに計算ができる。「PHPで巨大素数の生成と判定」をご覧いただきたい。
C++ にも GMPライブラリ が用意されており、これを適用した変数は上表の制約を受けずに計算ができる。「C++ で巨大素数を判定・生成する」をご覧いただきたい。
ただし、多倍長整数ライブラリで利用できる演算は、処理系によって制約があるので留意されたい。
(この項おわり)
header