値域による最大値・最小値
最大値をなぜ気にしなければならないか?
固定長で記憶領域を取りたいケースは結構ある。
不定長記憶領域は、取り扱いにコストが掛かる。
不定長を許すと、DoS攻撃されやすくなる。(メモリを食い尽くしてしまう)
領域のサイズを入れておくのにもコストが掛かる。
16bit か 32bit か 64bit かで、2byte, 4byte, 8byte 必要となる。これが1024レコードあれば、2KiB, 4KiB, 8KiB となる。
オーバーフローが起きると、システムが異常停止したり、その後の動作が保証されないことがある。
メモリの確保量が多すぎると、システムが停止する要因になる。
計算量が多すぎると、システムが無反応または停止する要因になる。
table:limits
2^15 32,767
2^16 65,536 ≒10^4
2^31 2,147,483,648 ≒10^9
2^32 4,294,967,296 ≒10^9
2^53 9,007,199,254,740,992 ≒10^15
2^63 9,223,372,036,854,775,808 ≒10^18
2^64 18,446,744,073,709,551,616 ≒10^19
n bit 符号なしの場合、最小値は 0, 最大値は $ 2^n - 1
n bit 符号ありの場合、最小値は $ -2^{n-1}、 最大値は $ 2^{n-1} - 1
JavaScript では IEEE 754 浮動小数点数をそのまま整数用に流用しているため、53bit分しか整数を表せない。
C言語
limits.h, float.h, stdint.h ヘッダに各種定義がある。
table:c_limit
char CHAR_MAX CHAR_MIN limits.h
signed char SCHAR_MAX SCHAR_MIN limits.h
unsigned char UCHAR_MAX limits.h
short int SHRT_MAX SHRT_MIN limits.h
unsigned short int USHRT_MAX limits.h
int INT_MAX INT_MIN limits.h
unsigned int UINT_MAX limits.h
long int LONG_MAX LONG_MIN limits.h
unsigned long int ULONG_MAX limits.h
long long int LLONG_MAX LLONG_MIN limits.h
unsigned long long int ULLONG_MAX limits.h
float FLT_MAX FLT_MIN float.h
double DBL_MAX DBL_MIN float.h
long double LDBL_MAX LDBL_MIN float.h
int{N}_t INT{N}_MAX INT{N}_MIN stdint.h
uint{N}_t UINT{N}_MAX UINT{N}_MIN stdint.h
int_least{N}_t INT_LEAST{N}_MAX INT_LEAST{N}_MIN stdint.h
uint_least{N}_t UINT_LEAST{N}_MAX UINT_LEAST{N}_MIN stdint.h
int_fast{N}_t INT_FAST{N}_MAX INT_FAST{N}_MIN stdint.h
uint_fast{N}_t UINT_FAST{N}_MAX UINT_FAST{N}_MIN stdint.h
intptr_t INTPTR_MAX INTPTR_MIN stdint.h
uintptr_t UINTPTR_MAX stdint.h
intmax_t INTMAX_MAX INTMAX_MIN stdint.h
uintmax_t UINTMAX_MAX stdint.h
ptrdiff_t PTRDIFF_MAX PTRDIFF_MIN stdint.h
sig_atomic_t SIG_ATOMIC_MAX SIG_ATOMIC_MIN stdint.h
size_t SIZE_MAX stdint.h
wchar_t WCHAR_MAX WCHAR_MIN stdint.h
wint_t WINT_MAX WINT_MIN stdint.h
マルチバイト文字1文字最大長 MB_LEN_MAX limits.h
FLT_MIN, DBL_MIN, LDBL_MIN は「正の最小値」という定義になっていることに注意。
なぜか short が SHRT という見慣れない省略になっているので注意。
なぜ変な省略が多いのか? 黎明期はメモリ容量が少なく、1文字でも短くしたかったため。
short, int, long, long long は実行環境に合わせることで汎用化を狙ったものだが、今となっては混乱の元にしかならない。
intN_t, uintN_t を使うべき。
JavaScript
Number.MAX_VALUE
Number.MIN_VALUE
Number.MAX_SAFE_INTEGER
Number.MIN_SAFE_INTEGER