C言語のint型の解説【short int, long int, long long int】
- 作成日: 2024-02-26
- 更新日: 2024-02-26
- カテゴリ: C言語
C言語のint型は符号付き整数を表す型です。
これに関連する型も複数あります。
サイズが異なるため用途に合わせて選択していくことが必要です。
この記事ではC言語のint型関連の型を解説していきます。
調査環境は以下の通りです。
- Windows10 64ビット
- WSL2 (Ubuntu 20.04LTS)
- glibc-2.34
int型
// int
// 通常は 16 ビット(2バイト) または 32 ビット(4バイト)
// intの最小値-32767, 最大値+32767
// unsigned intの最小値0, 最大値+65535
int a = 1; // 符号付き整数
signed int b = 1; // 符号付き整数
unsigned int c = 1; // 符号なし整数
printf("%d %d %d\n", a, b, c);
printf("sizeof(int) = %ld\n", sizeof(int));
printf("sizeof(signed int) = %ld\n", sizeof(signed int));
printf("sizeof(unsigned int) = %ld\n", sizeof(unsigned int));
// 1 1 1
// sizeof(int) = 4
// sizeof(signed int) = 4
// sizeof(unsigned int) = 4
int
型は通常は16ビット(2バイト)または32ビット(4バイト)の符号付き整数型です。
int
の範囲は規格では最小値が-32767, 最大値が+32767と定義されています。
signed int
はint
にsigned
を付けた型です。
これはint
と同等になります。
unsigned int
はint
から符号をなくした型です。
符号が無い分、表現できるプラスの値が増えるため最小値は0, 最大値は+65535までとなります。
これら3つの型はともにprintf()
で出力するときは%d
を使います。
short int型
// short int
// 16ビット(2バイト)
// short intの最小値-32767, 最大値+32767
// unsigned short intの最小値0, 最大値+65535
short int d = 1; // 符号付き整数
signed short int e = 1; // 符号付き整数
unsigned short int f = 1; // 符号なし整数
printf("%d %d %d\n", d, e, f);
printf("sizeof(short int) = %ld\n", sizeof(short int));
printf("sizeof(signed short int) = %ld\n", sizeof(signed short int));
printf("sizeof(unsigned short int) = %ld\n", sizeof(unsigned short int));
// 1 1 1
// sizeof(short int) = 2
// sizeof(signed short int) = 2
// sizeof(unsigned short int) = 2
short int
型はint
よりサイズが小さい符号付きの整数型です。
16ビット(2バイト)で規格では最小値は-32767, 最大値は+32767と定義されています。
signed short int
は符号付きを明示した型ですがこれはshort int
と同等です。
unsigned short int
はshort int
から符号を無くした型です。
符号を無くしている分、表現できる値の範囲が最小値0, 最大値+65535とプラスの範囲が多くなっています。
これら3つの型はともにprintf()
で出力するときは%d
を使います。
long int型
// long int
// 32 ビット(4バイト)または 64 ビット(8バイト)
// long intの最小値-2147483647, 最大値+2147483647
// unsigned long intの最小値0, 最大値+4294967295
long int g = 1; // 符号付き整数
signed long int h = 1; // 符号付き整数
unsigned long int i = 1; // 符号なし整数
printf("%ld %ld %ld\n", g, h, i);
printf("sizeof(long int) = %ld\n", sizeof(long int));
printf("sizeof(signed long int) = %ld\n", sizeof(signed long int));
printf("sizeof(unsigned long int) = %ld\n", sizeof(unsigned long int));
// 1 1 1
// sizeof(long int) = 8
// sizeof(signed long int) = 8
// sizeof(unsigned long int) = 8
long int
型はint
型よりもサイズが大きい符号付き整数型です。
32ビット(4バイト)または64ビット(8バイト)のサイズになります。
規格では最小値は-2147483647, 最大値は+2147483647になります。
signed long int
型は符号付きを明示した型ですが、これもlong int
と同等です。
unsigned long int
型はlong int
型から符号を無くした型です。
符号が無い分、表現できる値は最大値+4294967295と大きくなっています。
これら3つの型はprintf()
で出力するときは%ld
を使います。
long long int型
// long long int
// 64 ビット(8バイト)
// long long intの最小値-9223372036854775807, 最大値+9223372036854775807
// unsigned long long intの最小値0, 最大値18446744073709551615
long long int j = 1; // 符号付き整数
signed long long int k = 1; // 符号付き整数
unsigned long long int l = 1; // 符号なし整数
printf("%lld %lld %lld\n", j, k, l);
printf("sizeof(long long int) = %ld\n", sizeof(long long int));
printf("sizeof(signed long long int) = %ld\n", sizeof(signed long long int));
printf("sizeof(unsigned long long int) = %ld\n", sizeof(unsigned long long int));
// 1 1 1
// sizeof(long long int) = 8
// sizeof(signed long long int) = 8
// sizeof(unsigned long long int) = 8
long long int
型はlong int
型よりもサイズが大きい符号付き整数型です。
サイズは64ビット(8バイト)で、規格による最小値と最大値は以下の通りです。
- 最小値: -9223372036854775807
- 最大値: +9223372036854775807
signed long long int
型はlong long int
型に符号付きを明示しただけでlong long int
型と同等です。
unsigned long long int
型は符号を無くした型です。
そのため表現できる値の範囲は以下のように変わります。
- 最小値: 0
- 最大値: +18446744073709551615
stdint.hで定義されるint型
C99からstdint.h
をインクルードしてint32_t
などの型を使えるようになっています。
#include <stdint.h>
int8_t系
// stdint.h
// 符号付き整数型。
int8_t m = 1; // signed char
int16_t n = 1; // signed short int
int32_t o = 1; // signed int
int64_t p = 1; // signed long int または signed long long int
printf("%d %d %d %ld\n", m, n, o, p);
printf("sizeof(int8_t) = %ld\n", sizeof(int8_t));
printf("sizeof(int16_t) = %ld\n", sizeof(int16_t));
printf("sizeof(int32_t) = %ld\n", sizeof(int32_t));
printf("sizeof(int64_t) = %ld\n", sizeof(int64_t));
// 1 1 1 1
// sizeof(int8_t) = 1
// sizeof(int16_t) = 2
// sizeof(int32_t) = 4
// sizeof(int64_t) = 8
int8_t
や8ビットの符号付き整数型です。
glibc
では定義はsigned char
になっていました。
int16_t
は16ビットの符号付き整数型です。
定義はsigned short int
になっていました。
int32_t
は32ビットの符号付き整数型です。
定義はsigned int
になってました。
int64_t
は64ビットの符号付き整数型です。
定義はsigned long int
またはsigned long long int
になっていました。
int64_t
以外はprintf()
で%d
で出力できます。
int64_t
は%ld
で出力が可能です。
uint8_t系
// stdint.h
// 符号なし整数型。
uint8_t q = 1; // unsigned char
uint16_t r = 1; // unsigned short int
uint32_t s = 1; // unsigned int
uint64_t t = 1; // unsigned long int または unsigned long long int
printf("%d %d %d %ld\n", q, r, s, t);
printf("sizeof(uint8_t) = %ld\n", sizeof(uint8_t));
printf("sizeof(uint16_t) = %ld\n", sizeof(uint16_t));
printf("sizeof(uint32_t) = %ld\n", sizeof(uint32_t));
printf("sizeof(uint64_t) = %ld\n", sizeof(uint64_t));
// 1 1 1 1
// sizeof(uint8_t) = 1
// sizeof(uint16_t) = 2
// sizeof(uint32_t) = 4
// sizeof(uint64_t) = 8
uint8_t
は8ビットの符号なし整数型です。
glibc
では定義はunsigned char
になっていました。
uint16_t
は16ビットの符号なし整数型です。
定義はunsigned short int
になっていました。
uint32_t
は32ビットの符号なし整数型です。
定義はunsigned int
になっていました。
uint64_t
は64ビットの符号なし整数型です。
定義はunsigned long int
またはunsigned long long int
になっていました。
uint64_t
以外はprintf()
で%d
で出力できます。
uint64_t
は%ld
で出力が可能です。
int_least8_t系
// stdint.h
// 最も小さい符号付き整数型。
// int8_tなどが使えない環境のために用意されている。
int_least8_t u = 1; // signed char
int_least16_t v = 1; // signed short int
int_least32_t w = 1; // signed int
int_least64_t x = 1; // signed long int または signed long long int
printf("%d %d %d %ld\n", u, v, w, x);
printf("sizeof(int_least8_t) = %ld\n", sizeof(int_least8_t));
printf("sizeof(int_least16_t) = %ld\n", sizeof(int_least16_t));
printf("sizeof(int_least32_t) = %ld\n", sizeof(int_least32_t));
printf("sizeof(int_least64_t) = %ld\n", sizeof(int_least64_t));
// 1 1 1 1
// sizeof(int_least8_t) = 1
// sizeof(int_least16_t) = 2
// sizeof(int_least32_t) = 4
// sizeof(int_least64_t) = 8
int_least8_t
系の型はC11から使える型です。int8_t
系の型を使えない環境のために用意されている最も小さい符号付き整数の型です。
int_least8_t
は8ビットの符号付き整数型です。
glibc
では定義はsigned char
になっていました。
int_least16_t
は16ビットの符号付き整数型です。
定義はsigned short int
になっていました。
int_least32_t
は32ビットの符号付き整数型です。
定義はsigned int
になっていました。
int_least64_t
は64ビットの符号付き整数型です。
定義はsigned long int
またはsigned long long int
になっていました。
int_least64_t
以外はprintf()
で%d
で出力できます。
int_least64_t
は%ld
で出力が可能です。
// stdint.h
// 最も小さい符号なし整数型。
// uint8_tなどが使えない環境のために用意されている。
uint_least8_t y = 1; // unsigned char
uint_least16_t z = 1; // unsigned short int
uint_least32_t aa = 1; // unsigned int
uint_least64_t ab = 1; // unsigned long int または unsigned long long int
printf("%d %d %d %ld\n", y, z, aa, ab);
printf("sizeof(uint_least8_t) = %ld\n", sizeof(uint_least8_t));
printf("sizeof(uint_least16_t) = %ld\n", sizeof(uint_least16_t));
printf("sizeof(uint_least32_t) = %ld\n", sizeof(uint_least32_t));
printf("sizeof(uint_least64_t) = %ld\n", sizeof(uint_least64_t));
// 1 1 1 1
// sizeof(uint_least8_t) = 1
// sizeof(uint_least16_t) = 2
// sizeof(uint_least32_t) = 4
// sizeof(uint_least64_t) = 8
uint_least8_t
系の型はint_least8_t
系の型から符号を取ったものです。
uint_least8_t
は8ビットの符号なし整数型です。
glibc
では定義はunsigned char
になっていました。
uint_least16_t
は16ビットの符号なし整数型です。
定義はunsigned short int
になっていました。
uint_least32_t
は32ビットの符号なし整数型です。
定義はunsigned int
になっていました。
uint_least64_t
は64ビットの符号なし整数型です。
定義はunsigned long int
またはunsigned long long int
になっていました。
uint_least64_t
以外はprintf()
で%d
で出力できます。
uint_least64_t
は%ld
で出力が可能です。
int_fast8_t系
// stdint.h
// 高速に処理される符号付き整数型。
int_fast8_t ac = 1; // signed char
int_fast16_t ad = 1; // long int または int
int_fast32_t ae = 1; // long int または int
int_fast64_t af = 1; // long int または long long int
printf("%d %ld %ld %ld\n", ac, ad, ae, af);
printf("sizeof(int_fast8_t) = %ld\n", sizeof(int_fast8_t));
printf("sizeof(int_fast16_t) = %ld\n", sizeof(int_fast16_t));
printf("sizeof(int_fast32_t) = %ld\n", sizeof(int_fast32_t));
printf("sizeof(int_fast64_t) = %ld\n", sizeof(int_fast64_t));
// 1 1 1 1
// sizeof(int_fast8_t) = 1
// sizeof(int_fast16_t) = 8
// sizeof(int_fast32_t) = 8
// sizeof(int_fast64_t) = 8
int_fast8_t
系の型は高速に処理される符号付き整数型です。
int_fast8_t
は8ビットの符号付き整数型です。
glibc
では定義はsigned char
になっていました。
int_fast16_t
は16ビットの符号付き整数型です。
定義はlong int
またはint
になっていました。
int_fast32_t
は32ビットの符号付き整数型です。
定義はlong int
またはint
になっていました。
int_fast64_t
は64ビットの符号付き整数型です。
定義はlong int
またはlong long int
になっていました。
printf()
の出力はint_fast8_t
は%d
でそれ以外は%ld
になります。
uint_fast8_t系
// stdint.h
// 高速に処理される符号なし整数型。
uint_fast8_t ag = 1; // unsigned char
uint_fast16_t ah = 1; // unsigned long int または unsigned int
uint_fast32_t ai = 1; // unsigned long int または unsigned int
uint_fast64_t aj = 1; // unsigned long int または unsigned long long int
printf("%d %ld %ld %ld\n", ag, ah, ai, aj);
printf("sizeof(uint_fast8_t) = %ld\n", sizeof(uint_fast8_t));
printf("sizeof(uint_fast16_t) = %ld\n", sizeof(uint_fast16_t));
printf("sizeof(uint_fast32_t) = %ld\n", sizeof(uint_fast32_t));
printf("sizeof(uint_fast64_t) = %ld\n", sizeof(uint_fast64_t));
// 1 1 1 1
// sizeof(uint_fast8_t) = 1
// sizeof(uint_fast16_t) = 8
// sizeof(uint_fast32_t) = 8
// sizeof(uint_fast64_t) = 8
uint_fast8_t
系はint_fast8_t
系から符号を取ったものです。
uint_fast8_t
は8ビットの符号なし整数型です。
glibc
では定義はunsigned char
になっていました。
uint_fast16_t
は16ビットの符号なし整数型です。
定義はunsigned long int
またはunsigned int
になっていました。
uint_fast32_t
は32ビットの符号なし整数型です。
定義はunsigned long int
またはunsigned int
になっていました。
uint_fast64_t
は64ビットの符号なし整数型です。
定義はunsigned long int
またはunsigned long long int
になっていました。
printf()
の出力はuint_fast8_t
は%d
でそれ以外は%ld
になります。
intptr_t系
// stdint.h
intptr_t ak = 1; // long int または int
uintptr_t al = 1; // unsigned long int または unsigned int
printf("%ld %ld\n", ak, al);
printf("sizeof(intptr_t) = %ld\n", sizeof(intptr_t));
printf("sizeof(uintptr_t) = %ld\n", sizeof(uintptr_t));
// 1 1
// sizeof(intptr_t) = 8
// sizeof(uintptr_t) = 8
intptr_t
は汎用ポインタのvoid *
と相互変換できる型です。
メモリのアドレス値を表す整数を取る型と言えます。
void *p = 0x1234;
intptr_t ip = (intptr_t) p;
void *p2 = (void *) ip;
glibc
では定義はlong int
またはint
になっていました。
uintptr_t
はintptr_t
から符号を取ったものです。
定義はunsigned long int
またはunsigned int
になっていました。
intptr_t
もuintptr_t
もともにprintf()
で出力するときは%ld
を使います。
intmax_t系
// stdint.h
// 任意の値を表現するための最大幅の整数型
intmax_t am = 1; // long int または long long int
uintmax_t an = 1; // unsigned long int または unsigned long long int
printf("%ld %ld\n", am, an);
printf("sizeof(intmax_t) = %ld\n", sizeof(intmax_t));
printf("sizeof(uintmax_t) = %ld\n", sizeof(uintmax_t));
// 1 1
// sizeof(intmax_t) = 8
// sizeof(uintmax_t) = 8
intmax_t
型は任意の値を表現するための最大幅のサイズを取る整数型です。
glibc
ではintmax_t
はlong int
またはlong long int
で定義されます。
uintmax_t
型はintmax_t
から符号を取ったものです。
unsigned long int
またはunsigned long long int
で定義されていました。