
C言語基礎|整数型の表現範囲
整数型をちゃんと使い分けるコツは、めちゃくちゃシンプルで―
その型が表せる最小値・最大値(表現範囲)を知っておくことです。
たとえば「人数」「回数」「配列の要素数」みたいに 0以上しか出ない 値なら unsigned が候補になりますし、
「差分」「増減」「温度」みたいに 負が出る 値なら signed が必要になります。
そしてもう1つ。
基本は int を使う。これがCの“気持ちいい”スタート地点です。
(必要になったら long や long long に引っ越す、が定石)
まずは表現範囲を一覧でつかもう(標準Cで保証される最低限)
下の表は「どの処理系でも最低これだけは保証するよ」という 最低ラインです。
実際の環境では、これより広いことが多いです。
整数型の表現範囲(標準Cで保証される値)
| 型 | 最小値 | 最大値 |
|---|---|---|
| char | 0 | 255 |
| char(別の可能性) | -127 | 127 |
| signed char | -127 | 127 |
| unsigned char | 0 | 255 |
| short | -32,767 | 32,767 |
| int | -32,767 | 32,767 |
| long | -2,147,483,647 | 2,147,483,647 |
| long long | -9,223,372,036,854,775,807 | 9,223,372,036,854,775,807 |
| unsigned short | 0 | 65,535 |
| unsigned | 0 | 65,535 |
| unsigned long | 0 | 4,294,967,295 |
| unsigned long long | 0 | 18,446,744,073,709,551,615 |
この表の「読みどころ」
- char は処理系依存で、符号付きにも符号無しにもなり得ます(どっちかは環境次第)
- unsigned 系の 最小値は常に0
- long / long long は大きい数が扱えるけど、環境によっては 計算が重くなったり メモリが増えたりします
なぜ「基本は int」なの?
ここ、超大事ポイントです。
int / long / long long の使い分けイメージ
| 型 | 得意なこと | 注意点 | よくある用途 |
|---|---|---|---|
| int | 扱いやすい、速いことが多い | 範囲が足りないことがある | ほとんどの整数計算、ループ変数 |
| long | intより範囲を広げたい | 環境でサイズが違う | 大きめの計算、時間、IDなど |
| long long | かなり大きい整数 | 出力書式も専用が必要 | 大きなカウンタ、桁が大きい値 |
結論:迷ったら int。
足りないと分かったときにだけ、型を大きくするのがラクです。
「本当の範囲」は <limits.h> で調べるのが正解
さっきの表は「最低保証」です。
でも実際には、あなたのPC/コンパイラでの範囲を知りたいですよね。
そのために C では <limits.h> が用意されています。
ここには各型の最小値・最大値が マクロで入っています。
<limits.h> にある代表的な範囲マクロ
| 型 | 最小値マクロ | 最大値マクロ |
|---|---|---|
| char | CHAR_MIN | CHAR_MAX |
| signed char | SCHAR_MIN | SCHAR_MAX |
| unsigned char | なし(最小は0) | UCHAR_MAX |
| short | SHRT_MIN | SHRT_MAX |
| int | INT_MIN | INT_MAX |
| long | LONG_MIN | LONG_MAX |
| long long | LLONG_MIN | LLONG_MAX |
| unsigned int | なし(最小は0) | UINT_MAX |
※ unsigned の最小値は常に 0 なので、最小値マクロは基本的にありません。
サンプルプログラム
「自分の環境での範囲を表示する」プログラムを例に解説をします。
プロジェクト名:chap7-6-1 ソースファイル名:chap7-6-1.c
Visual Studio でこのプログラムを実行するには、SDLチェック設定を変更しておく必要があります。
1.プロジェクト名を右クリックして、「プロパティ」をクリックします。
2.「C/C++」→「全般」→「SDLチェック」を「いいえ」に切り替えて「OK」をクリックします。
// 自分の環境での整数型の表現範囲を表示する
#include <stdio.h>
#include <limits.h>
int main(void)
{
puts("=== この環境での整数型の表現範囲 ===");
printf("char : %d ~ %d\n", CHAR_MIN, CHAR_MAX);
printf("signed char : %d ~ %d\n", SCHAR_MIN, SCHAR_MAX);
printf("unsigned char : %u ~ %u\n", 0U, UCHAR_MAX);
printf("short : %d ~ %d\n", SHRT_MIN, SHRT_MAX);
printf("int : %d ~ %d\n", INT_MIN, INT_MAX);
printf("long : %ld ~ %ld\n", LONG_MIN, LONG_MAX);
printf("long long : %lld ~ %lld\n", LLONG_MIN, LLONG_MAX);
printf("unsigned short : %u ~ %u\n", 0U, USHRT_MAX);
printf("unsigned int : %u ~ %u\n", 0U, UINT_MAX);
printf("unsigned long : %lu ~ %lu\n", 0UL, ULONG_MAX);
printf("unsigned long long: %llu ~ %llu\n", 0ULL, ULLONG_MAX);
return 0;
}登場する命令の書式と「何をするか」
#include
- 書式:#include <ヘッダ名>
- 何をする:標準ライブラリの宣言やマクロ定義を取り込む
例:<stdio.h>(printf など)、<limits.h>(INT_MAX など)
puts
- 書式:puts(文字列);
- 何をする:文字列を表示して改行する(お知らせ行に便利)
printf
- 書式:printf(書式文字列, 値, ...);
- 何をする:値を指定した形式で表示する
書式指定子(範囲表示で重要)
| 指定子 | 対象 | 例 |
|---|---|---|
| %d | int(符号付き) | INT_MIN など |
| %u | unsigned int | UINT_MAX など |
| %ld | long | LONG_MAX など |
| %lld | long long | LLONG_MAX など |
| %lu | unsigned long | ULONG_MAX など |
| %llu | unsigned long long | ULLONG_MAX など |
図で理解:unsigned は「0から始まる世界」
図:signed と unsigned の範囲イメージ(概念図)

この図が示しているのは、
- signed は 0 を中心に負側がある
- unsigned は 0 からスタートして正側に全振り
という違いです。
よくある指針(使い分けの現場ルール)
表:型選びの実務っぽい指針
| やりたいこと | まず候補 | 理由 |
|---|---|---|
| 普通の整数計算 | int | 扱いやすい、速いことが多い |
| 大きな値が必要 | long / long long | 範囲が足りないときだけ拡張 |
| 0以上しか出ない | unsigned | 範囲を正側に使い切れる |
| 文字を扱う | char / unsigned char | 文字コードの扱いで使う |
