概要
整数は一番基本になる数です。整数の実装には大きく分けて三つあります。一つは0と正の整数を扱う符号無し整数、一つは0と正負両方の整数を扱う符号付き無し整数、最後はメモリが許す限りどんな大きな数も扱える多倍長整数です。
メモリは有限ですので、何バイトのメモリ領域を使って整数を表すのかが問題になります。たとえば1と言う数を表すのに1バイトあれば十分です。しかし1バイトのメモリでは符号無し整数で 0..255 、符号付き整数だと -125..126 までしか表現できません。そのため、言語によっては使用するメモリのサイズが異なる複数の大きさの型を用意しています。
しかし、使用するメモリが固定された場合は、非常に大きな数は計算できません。たとえば、21!(21の階乗=51090942171709440000)で8バイト(64ビット)を越えてしまいます。通常の環境では8バイトまで、多くても16バイトまでしか用意されてません。16バイトでも35!(35の階乗=10333147966386144929666651337523200000000)で足りなくなります。そこで、言語によっては多倍長整数が用意されています。
多倍長整数は整数の大きさによって自動的に必要なメモリ領域を確保します。メモリが許す限りどんな大きさの整数も扱えるため、計算結果の大きさを気にする必要がありません。しかし、位ごとの計算やメモリ確保の処理が含まれるため、固定長の整数と違って多倍長整数の演算はコストが高くなります。通常の整数計算は固定長の整数を使用し、大きくなる場合だけ多倍長整数を使うのがいいようです。言語によっては内部処理が自動的に切り替わるものもあります。
一覧
言語 | 型/クラス | 別名 | 継承 | 符号 | サイズ(bit数) | 最小値 | 最大値 | ライブラリ | リテラル | 説明 |
---|---|---|---|---|---|---|---|---|---|---|
C | char | #1 | #2≧ 8CHRA_BIT | #3環境依存CHAR_MIN | #4環境依存CHAR_MIN | #5 | #6'*' '\52' '\x2A' | ASCII及びUTF-8等のマルチバイト文字。実体はsigned char またはunsigned char のどちらかになります。 | ||
signed char | ○ | ≧ 8CHRA_BIT | ≦ -127SCHAR_MIN | ≧ 127SCHAR_MAX | #5 | |||||
unsigned char | × | ≧ 8CHRA_BIT | 0 | ≧255UCHAR_MAX | #5 | signed char の符号無し版。 | ||||
short int | signed short short signed short int | ○ | ≧ 16 | ≦ -32767SHRT_MIN | ≧ 32767SHRT_MAX | #5 | ||||
unsigned short int | unsigned short | × | ≧ 16 | 0 | ≧ 65535USHRT_MAX | #5 | short int の符号無し版。 | |||
int | signed signed int | ○ | #7≧ 16 | ≦ -32767INT_MIN | ≧ 32767INT_MAX | #5 | #9 #842 052 0x2a -42 | サイズは実行環境のアーキテクチャで提案された(suggest)自然な大きさ(natural size)です。CPUのビット数やポインタのサイズと同じとは限りません。 | ||
unsigned int | unsigned | × | #10≧ 16 | 0 | ≧ 65535UINT_MAX | #5 | #842u 052u 0x2au | int の符号無し版。 | ||
long int | signed long int long signed long | ○ | #11≧ 32 | ≦ -2147483647LONG_MAX | ≦ 2147483647LONG_MAX | #5 | #9 #842l 052l 0x2al -42l | |||
unsigned long int | unsigned long | × | #11≧ 32 | 0 | ≦ 4294967295LONG_MAX | #5 | #12 #842ul 052ul 0x2aul | long int の符号無し版。 | ||
long long int | ○ | ≧ 64 | ≦ -9223372036854775807LLONG_MIN | ≧ 9223372036854775807LLONG_MAX | #5 | #9 #12 #842ll 052ll 0x2all -42ll | ||||
unsigned long long int | × | ≧ 64 | 0 | ≧ 18446744073709551615ULLONG_MAX | #5 | #12 #842ull 052ull 0x2aull | long long int の符号無し版。 | |||
intN_t | ○ | N | -2N-1INTN_MIN | 2N-1-1INTN_MAX | <stdint.h> | 必ずNbitのサイズになる整数です。実装はオプションですが、8, 16 32, 64はほとんどの環境で実装されています。" | ||||
uintN_t | × | N | 0 | 2N-1UINTN_MAX | intN_t の符号無し版。 | |||||
int_leastN_t | ○ | ≧ N | ≦ -(2N-1-1)INT_LEASTN_MIN | ≧ 2N-1-1INT_LEASTN_MAX | <stdint.h> | 少なくともNbitのサイズがある整数です。8, 16 32, 64のみ必須で、その他の数はオプションになります。 | ||||
uint_leastN_t | × | ≧ N | 0 | ≧ 2N-1UINT_LEASTN_MAX | <stdint.h> | intNleast_t の符号無し版。8, 16 32, 64のみ必須、他はオプション。 | ||||
int_fastN_t | ○ | ≧ N | ≦ -(2N-1-1)INT_FASTN_MIN | ≧ 2N-1-1INT_FASTN_MAX | <stdint.h> | 少なくともNbitのサイズがあり、かつ、演算処理が最も速い整数です。8, 16 32, 64のみ必須、他はオプション。 | ||||
uint_fastN_t | × | ≧ N | 0 | ≧ 2N-1UINT_LEASTN_MAX | intNfast_t の符号無し版。8, 16 32, 64のみ必須、他はオプション。 | |||||
intptr_t INTPTR_MIN | ○ | ≧ 16 | ≦ -(215-1)INTPTR_MIN | ≧ 215-1INTPTR_MAX | <stdint.h> | void * と必ず同じサイズの整数です。実装はオプション。 | ||||
uintptr_t | × | ≧ 16 | 0 | ≧ 216-1UINTPTR_MAX | <stdint.h> | intptr_t の符号無し版。 | ||||
intmax_t | ○ | ≧ 64 | ≦ -(263-1)INTMAX_MIN | ≧ 263-1INTMAX_MAX | <stdint.h> | 実装されている最大のサイズの整数です。 | ||||
uintmax_t | × | ≧ 64 | 0 | ≧ 264-1UINTMAX_MAX | <stdint.h> | intmax_t の符号無し版。 | ||||
ptrdiff_t | ○ | ≧ 16 | ≦ −65535PTRDIFF_MIN | ≧ +65535PTRDIFF_MAX | #13<stddef.h> | 二つのポインタを引いた結果。 | ||||
size_t | × | 0 | ≧ 65535SIZE_MAX | #13<stddef.h> | sizeof の結果。 | |||||
max_align_t | #13<stddef.h> | 実装によってサポートされたアライメントと同じ大きさ。 | ||||||||
wchar_t | #1 | ≧ 8 | ≦ -127 or 0WCHAR_MIN | ≧ 127 or ≧ 255WCHAR_MAX | #13<stddef.h> | L'*' L'\52' L'\x2A' | ワイド文字。ワイド文字が入る大きさ。Unicode環境(0-0x10FFFFの21ビット)では符号有り通常32ビット。 | |||
wint_t | #1 | ≧ 16 | ≦ -32767 or 0WINT_MIN | ≧ 32767 or ≧ 65535WINT_MAX | #13<wchar.h> | wchar_t の全ての文字とWEOF と区別できる大きさ。wchar_t と同じ場合もある。 | ||||
char16_t | uint_least16_tと同じ。 | <uchar.h> | u'*' u'\52' u'\x2A' | UTF-16文字。 | ||||||
char32_t | uint_least32_tと同じ。 | <uchar.h> | U'*' U'\52' U'\x2A' | UTF-32文字。 | ||||||
sig_atomic_t | #1 | ≧ 8 | ≦ -127 or 0SIG_ATOMIC_MIN | ≧ 127 or ≧ 255SIG_ATOMIC_MAX | #13<signal.h> | 非同期割り込みで、アトミックにアクセスできるviolate修飾付き整数。 | ||||
C++ | 調査中 | |||||||||
Java | byte | ○ | 8 | -128 | 127 | |||||
short | ○ | 16 | -32768 | 32767 | ||||||
int | ○ | 32 | -2147483648 | 2147483647 | ||||||
long | ○ | 64 | -9223372036854775808 | 9223372036854775807 | ||||||
char | × | 16 | 0 | 65535 | UTF-16文字。 | |||||
Byte | Numeric Object | byte のラッパークラス。 | java.lang | |||||||
Short | Numeric Object | short のラッパークラス。 | java.lang | |||||||
Integer | Numeric Object | int のラッパークラス。 | java.lang | |||||||
Long | Numeric Object | long のラッパークラス。 | java.lang | |||||||
Character | Object | char のラッパークラス。 | java.lang | |||||||
java.math.BigInteger | Numeric Object | ○ | 多倍長 | #14-∞ | #14∞ | java.math | ||||
C# | 調査中 | |||||||||
JavaScript | 曖昧な数値型参照。 | |||||||||
Perl | 曖昧な数値型参照。 | |||||||||
PHP | integer | ○ | プラットフォーム依存PHP_INT_SIZE | #15~PHP_INT_MAX | PHP_INT_MAX | 計算結果が最小値や最大値を越える場合は、自動的にfloatへ変化され、丸め込みが発生します。 | ||||
BC Math | ○ | 多倍長 | #14-∞ | #14∞ | 組込(bcmath) | "42" "-42" | 文字列を数字として扱います。コンパイル時に--enable-bcmathを指定する必要があります。Windowsバイナリは有効です。 | |||
GMP | ○ | 多倍長 | #14-∞ | #14∞ | gmp | gmp_init("42") | コンパイル時に--with-gmpを指定する必要があります。GMP(GNU Multiple Precision)ライブラリをそのまま使用します。PHPとのやりとりは文字列で行います。 | |||
Python | 調査中 | |||||||||
Ruby | Integer | Numeric" Object BasicObject | 実体はFixNum またはBigNum のどちらかです。 | 整数を扱う抽象クラスです。直接Integerのオブジェクトは存在しません。 | ||||||
FixNum | Integer Numeric Object BasicObject | ○ | #16P-1 | -2P-2 | 2P-2-1 | #1742 0b101010 052 0o52 0x2a -42 | 内部ではVALUE に1bit分シフトされてそのまま保存されています。計算結果が最小値や最大値を超える場合は、自動的にBigNum に変換されます。 | |||
BigNum | Integer Numeric Object BasicObject | ○ | 多倍長 | #14-∞ | #14∞ | Fixnum と同じ | 計算結果がFixNum に収まる場合は、自動的にFixNum に変換されます。 |
備考
- 環境依存。
- 処理系の1byteのbit数と同数。
SCHAR_MIN
またはUCHAR_MIN
と同値。SCHAR_MAX
またはUCHAR_MAX
と同値。- 定数は<limits.h>で宣言。
- 実際は
int
型になります。しかし、入力文字はunsigned char
の範囲内にしなければならないため、正しくchar
型へキャストされます。 - 一般的に、16bit環境では16bit、32bit環境では32bit、64bit環境ではLLP64(Windows)とLP64(UNIX/Linux)が32bit、ILP64が64bit。
- 英字は大文字小文字どちらも使用できます。ただし、
ll
とLL
のみ二つの文字を同じにする必要があります。 -
は単項演算子(unary operator)であり整数定数(integer constant)ではありません。- 一般的に、16bit環境では16bit、32bit環境では32bit、64bit環境ではLLP64(Windows)とLP64(UNIX/Linux)で32bit、ILP64で64bit。
- 一般的に、16bit環境と32bit環境では32bit、64bit環境ではLLP64(Windows)が32bit、LP64(UNIX/Linux)とILP64で64bit。
u/U
とl/L/ll/LL
の順序は逆も可能です。- 定数は
<stdint.h>
に定義されています。 - メモリが許す限り。
- 最小値を求める定数は存在しないため、2の補数を使用します。参考:http://php.net/manual/reserved.constants.php#88288
- Pはポインタのサイズ。
-
はリテラルの一部で有り、単項演算子メソッド-@()
ではありません。また、+
を付与することもできますが、同じくリテラル扱いです。
C言語では、intN_t
型を除く各型の最小値と最大値は以上または以下という定義であるため、実際は環境依存になります。int
は32ビットであるとは限らず、-32767(-32768ではないことに注意)以上かつ32767以下の範囲にある数が必ず収めることができることしか保証されません。char
の大きさを表し、1バイトと同じになるCHAR_BIT
ですら、8ビットとは限りません。ビットの大きさに依存するプログラミングをする場合はintN_t
型を使用しましょう。昔のプログラムでポインターをint
にキャストするような例がありますが、sizeof(int) == sizeof(void *)
が必ずしも真にならないため、使用すべきではありません。ポインターを数字として扱う場合はちゃんとintptr_t
を使いましょう。
ほとんどの言語では文字を整数として扱います。エンコード方式によって扱う型が異なりますので、注意が必要です。
要件
-
整数型の変数aと変数bを宣言する。宣言が不要な言語は省略してもよい。
-
変数aに24の値を代入する。
-
変数bに-24の値を代入する。
-
標準出力に変数aの値と変数bの値をそれぞれ出力する。
-
標準出力に変数の値を出力した後に、改行を行う。
-
全ての変数を出力後に、終了する。
-
標準入出力環境のエンコードはUTF-8とする。
-
ソースコードのエンコードはUTF-8とする。
ソースコード
上の言語リストから表示したい言語を選択してください。