整数型

概要

整数は一番基本になる数です。整数の実装には大きく分けて三つあります。一つは0と正の整数を扱う符号無し整数、一つは0と正負両方の整数を扱う符号付き無し整数、最後はメモリが許す限りどんな大きな数も扱える多倍長整数です。

メモリは有限ですので、何バイトのメモリ領域を使って整数を表すのかが問題になります。たとえば1と言う数を表すのに1バイトあれば十分です。しかし1バイトのメモリでは符号無し整数で 0..255 、符号付き整数だと -125..126 までしか表現できません。そのため、言語によっては使用するメモリのサイズが異なる複数の大きさの型を用意しています。

しかし、使用するメモリが固定された場合は、非常に大きな数は計算できません。たとえば、21!(21の階乗=51090942171709440000)で8バイト(64ビット)を越えてしまいます。通常の環境では8バイトまで、多くても16バイトまでしか用意されてません。16バイトでも35!(35の階乗=10333147966386144929666651337523200000000)で足りなくなります。そこで、言語によっては多倍長整数が用意されています。

多倍長整数は整数の大きさによって自動的に必要なメモリ領域を確保します。メモリが許す限りどんな大きさの整数も扱えるため、計算結果の大きさを気にする必要がありません。しかし、位ごとの計算やメモリ確保の処理が含まれるため、固定長の整数と違って多倍長整数の演算はコストが高くなります。通常の整数計算は固定長の整数を使用し、大きくなる場合だけ多倍長整数を使うのがいいようです。言語によっては内部処理が自動的に切り替わるものもあります。

一覧

言語型/クラス別名継承符号サイズ(bit数)最小値最大値ライブラリリテラル説明
Cchar#1#2≧ 8
CHRA_BIT
#3環境依存
CHAR_MIN
#4環境依存
CHAR_MIN
#5#6'*'
'\52'
'\x2A'
ASCII及びUTF-8等のマルチバイト文字。実体はsigned charまたはunsigned charのどちらかになります。
signed char≧ 8
CHRA_BIT
≦ -127
SCHAR_MIN
≧ 127
SCHAR_MAX
#5
unsigned char×≧ 8
CHRA_BIT
0≧255
UCHAR_MAX
#5signed charの符号無し版。
short intsigned short
short
signed short int
≧ 16≦ -32767
SHRT_MIN
≧ 32767
SHRT_MAX
#5
unsigned short intunsigned short×≧ 160≧ 65535
USHRT_MAX
#5short intの符号無し版。
intsigned
signed int
#7≧ 16≦ -32767
INT_MIN
≧ 32767
INT_MAX
#5#9 #842
052
0x2a
-42
サイズは実行環境のアーキテクチャで提案された(suggest)自然な大きさ(natural size)です。CPUのビット数やポインタのサイズと同じとは限りません。
unsigned intunsigned×#10≧ 160≧ 65535
UINT_MAX
#5#842u
052u
0x2au
intの符号無し版。
long intsigned long int
long
signed long
#11≧ 32≦ -2147483647
LONG_MAX
≦ 2147483647
LONG_MAX
#5#9 #842l
052l
0x2al
-42l
unsigned long intunsigned long×#11≧ 320≦ 4294967295
LONG_MAX
#5#12 #842ul
052ul
0x2aul
long intの符号無し版。
long long int≧ 64≦ -9223372036854775807
LLONG_MIN
≧ 9223372036854775807
LLONG_MAX
#5#9 #12 #842ll
052ll
0x2all
-42ll
unsigned long long int×≧ 640≧ 18446744073709551615
ULLONG_MAX
#5#12 #842ull
052ull
0x2aull
long long intの符号無し版。
intN_tN-2N-1
INTN_MIN
2N-1-1
INTN_MAX
<stdint.h>必ずNbitのサイズになる整数です。実装はオプションですが、8, 16 32, 64はほとんどの環境で実装されています。"
uintN_t×N02N-1
UINTN_MAX
intN_tの符号無し版。
int_leastN_tN≦ -(2N-1-1)
INT_LEASTN_MIN
≧ 2N-1-1
INT_LEASTN_MAX
<stdint.h>少なくともNbitのサイズがある整数です。8, 16 32, 64のみ必須で、その他の数はオプションになります。
uint_leastN_t×N0≧ 2N-1
UINT_LEASTN_MAX
<stdint.h>intNleast_tの符号無し版。8, 16 32, 64のみ必須、他はオプション。
int_fastN_tN≦ -(2N-1-1)
INT_FASTN_MIN
≧ 2N-1-1
INT_FASTN_MAX
<stdint.h>少なくともNbitのサイズがあり、かつ、演算処理が最も速い整数です。8, 16 32, 64のみ必須、他はオプション。
uint_fastN_t×N0≧ 2N-1
UINT_LEASTN_MAX
intNfast_tの符号無し版。8, 16 32, 64のみ必須、他はオプション。
intptr_t INTPTR_MIN≧ 16≦ -(215-1)
INTPTR_MIN
≧ 215-1
INTPTR_MAX
<stdint.h>void *と必ず同じサイズの整数です。実装はオプション。
uintptr_t×≧ 160≧ 216-1
UINTPTR_MAX
<stdint.h>intptr_tの符号無し版。
intmax_t≧ 64≦ -(263-1)
INTMAX_MIN
≧ 263-1
INTMAX_MAX
<stdint.h>実装されている最大のサイズの整数です。
uintmax_t×≧ 640≧ 264-1
UINTMAX_MAX
<stdint.h>intmax_tの符号無し版。
ptrdiff_t≧ 16≦ −65535
PTRDIFF_MIN
≧ +65535
PTRDIFF_MAX
#13<stddef.h>二つのポインタを引いた結果。
size_t×0≧ 65535
SIZE_MAX
#13<stddef.h>sizeofの結果。
max_align_t#13<stddef.h>実装によってサポートされたアライメントと同じ大きさ。
wchar_t#1≧ 8≦ -127 or 0
WCHAR_MIN
≧ 127 or ≧ 255
WCHAR_MAX
#13<stddef.h>L'*'
L'\52'
L'\x2A'
ワイド文字。ワイド文字が入る大きさ。Unicode環境(0-0x10FFFFの21ビット)では符号有り通常32ビット。
wint_t#1≧ 16≦ -32767 or 0
WINT_MIN
≧ 32767 or ≧ 65535
WINT_MAX
#13<wchar.h>wchar_tの全ての文字とWEOFと区別できる大きさ。wchar_tと同じ場合もある。
char16_tuint_least16_tと同じ。<uchar.h>u'*'
u'\52'
u'\x2A'
UTF-16文字。
char32_tuint_least32_tと同じ。<uchar.h>U'*'
U'\52'
U'\x2A'
UTF-32文字。
sig_atomic_t#1≧ 8≦ -127 or 0
SIG_ATOMIC_MIN
≧ 127 or ≧ 255
SIG_ATOMIC_MAX
#13<signal.h>非同期割り込みで、アトミックにアクセスできるviolate修飾付き整数。
C++調査中
Javabyte8-128127
short16-3276832767
int32-21474836482147483647
long64-92233720368547758089223372036854775807
char×16065535UTF-16文字。
ByteNumeric
Object
byteのラッパークラス。java.lang
ShortNumeric
Object
shortのラッパークラス。java.lang
IntegerNumeric
Object
intのラッパークラス。java.lang
LongNumeric
Object
longのラッパークラス。java.lang
CharacterObjectcharのラッパークラス。java.lang
java.math.BigIntegerNumeric
Object
多倍長#14-∞#14java.math
C#調査中
JavaScript曖昧な数値型参照。
Perl曖昧な数値型参照。
PHPintegerプラットフォーム依存
PHP_INT_SIZE
#15~PHP_INT_MAXPHP_INT_MAX計算結果が最小値や最大値を越える場合は、自動的にfloatへ変化され、丸め込みが発生します。
BC Math多倍長#14-∞#14組込(bcmath)"42"
"-42"
文字列を数字として扱います。コンパイル時に--enable-bcmathを指定する必要があります。Windowsバイナリは有効です。
GMP多倍長#14-∞#14gmpgmp_init("42")コンパイル時に--with-gmpを指定する必要があります。GMP(GNU Multiple Precision)ライブラリをそのまま使用します。PHPとのやりとりは文字列で行います。
Python調査中
RubyIntegerNumeric"
Object
BasicObject
実体はFixNumまたはBigNumのどちらかです。整数を扱う抽象クラスです。直接Integerのオブジェクトは存在しません。
FixNumInteger
Numeric
Object
BasicObject
#16P-1-2P-22P-2-1#1742
0b101010
052
0o52
0x2a
-42
内部ではVALUEに1bit分シフトされてそのまま保存されています。計算結果が最小値や最大値を超える場合は、自動的にBigNumに変換されます。
BigNumInteger
Numeric
Object
BasicObject
多倍長#14-∞#14Fixnumと同じ計算結果がFixNumに収まる場合は、自動的にFixNumに変換されます。

備考

  1. 環境依存。
  2. 処理系の1byteのbit数と同数。
  3. SCHAR_MINまたはUCHAR_MINと同値。
  4. SCHAR_MAXまたはUCHAR_MAXと同値。
  5. 定数は<limits.h>で宣言。
  6. 実際はint型になります。しかし、入力文字はunsigned charの範囲内にしなければならないため、正しくchar型へキャストされます。
  7. 一般的に、16bit環境では16bit、32bit環境では32bit、64bit環境ではLLP64(Windows)とLP64(UNIX/Linux)が32bit、ILP64が64bit。
  8. 英字は大文字小文字どちらも使用できます。ただし、llLLのみ二つの文字を同じにする必要があります。
  9. -は単項演算子(unary operator)であり整数定数(integer constant)ではありません。
  10. 一般的に、16bit環境では16bit、32bit環境では32bit、64bit環境ではLLP64(Windows)とLP64(UNIX/Linux)で32bit、ILP64で64bit。
  11. 一般的に、16bit環境と32bit環境では32bit、64bit環境ではLLP64(Windows)が32bit、LP64(UNIX/Linux)とILP64で64bit。
  12. u/Ul/L/ll/LLの順序は逆も可能です。
  13. 定数は<stdint.h>に定義されています。
  14. メモリが許す限り。
  15. 最小値を求める定数は存在しないため、2の補数を使用します。参考:http://php.net/manual/reserved.constants.php#88288
  16. Pはポインタのサイズ。
  17. -はリテラルの一部で有り、単項演算子メソッド-@()ではありません。また、+を付与することもできますが、同じくリテラル扱いです。

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とする。

ソースコード

上の言語リストから表示したい言語を選択してください。


間違いを見つけた場合や、ご意見・ご指摘はGitHubレポジトリIssuesへお願いします。