この記事は広告を含みます
はじめに
C言語では、整数を扱うために複数の型が用意されています。
代表的なのは
- char
- short
- int
- long
- long long
などです。
「とりあえず int を使っている」
という方も多いですが、実際には用途に応じて使い分けることが重要です。
この記事では、
- int・char・short・long の違い
- 最大値・最小値
- signed / unsigned
- 2の補数
- オーバーフロー
- 実務での使い分け
まで、初心者向けに順番に解説します。
整数型の種類
まずは、C言語で使われる整数型の一覧です。
| 型 | サイズ(目安) |
|---|---|
| char | 1バイト |
| short | 2バイト |
| int | 4バイト |
| long | 4 or 8バイト |
| long long | 8バイト |
※サイズは環境(コンパイラ・CPU)によって異なります
最大値・最小値(一覧)
signedは省略可能です。
■ 8bit(char)
| 型 | 最小値 | 最大値 |
|---|---|---|
| signed char | -128 | 127 |
| unsigned char | 0 | 255 |
■ 16bit(short)
| 型 | 最小値 | 最大値 |
|---|---|---|
| signed short | -32768 | 32767 |
| unsigned short | 0 | 65535 |
■ 32bit(int / long)
※ 環境によって long のサイズは変わる場合があります。
| 型 | 最小値 | 最大値 |
|---|---|---|
| signed int | -2147483648 | 2147483647 |
| unsigned int | 0 | 4294967295 |
| signed long | -2147483648 | 2147483647 |
| unsigned long | 0 | 4294967295 |
■ 64bit(long long)
| 型 | 最小値 | 最大値 |
|---|---|---|
| signed long long | -9223372036854775808 | 9223372036854775807 |
| unsigned long long | 0 | 18446744073709551615 |
初心者さんintだけじゃダメなんですか?



動くことは多いけど、それだと無駄が出ることもあるんだよね
例えば、
- メモリ使用量
- 通信データサイズ
- ハードウェア制御
などでは、型サイズを意識することが重要になります。
型に関する基本的な内容はこちらの記事でも解説しています。


C言語文法解説シリーズ
本記事は「C言語文法解説シリーズ」の1つです。
C言語の文法を、組み込み開発の視点も交えて解説しています。
C言語文法解説シリーズ一覧はこちら


ビット(bit)と値の範囲の関係



最大値ってなんで255とかになるんですか?



それはビットで決まるんだ
コンピュータでは、データはすべて 0 と 1 の組み合わせで表現されます。
この1つ1つを「ビット(bit)」と呼びます。
例えば、1バイトは8ビットです。
00000000 ~ 11111111
■ unsigned の場合
unsigned では、すべてのビットを数値として使えます。
そのため
- 最小値:0
- 最大値:255
になります。
00000000 = 0
11111111 = 255



全部1にしたら最大なんですね



そういうことだね
■ signed の場合
signed では1ビットを符号に使います。
その結果
-128 ~ 127
の範囲になります。
10000000 = -128
01111111 = 127
※ 負の数は2の補数で表現されます(後で解説)
最大値・最小値



最大値・最小値は覚えないとダメですか?



bitで理解すれば覚えなくていいよ
例えば
8bit unsigned → 0 ~ 255
16bit unsigned → 0 ~ 65535
のように、
2^bit数
で考えられるようになると理解しやすくなります。
signed / unsigned の違い
int a; // signed
unsigned int b; // unsigned- signed → 負の値を扱える
- unsigned → 0以上のみ
同じbit数でも、扱える範囲が変わります。
2の補数とは?(負の数の仕組み)
例:+5 → -5
① ビット反転
0000 0101 → 1111 1010
② 1を足す
1111 1010 → 1111 1011
👉 これが -5



なんでこんな面倒なことするんですか?



足し算で扱えるようにするためだよ
C言語では、整数の計算は基本的に「ビットの加算(足し算)」で行われます。
2の補数を使うことで、負の数も含めて同じ足し算の仕組みで計算できるようになります。
例えば👇
0000 0101 (+5)
+ 1111 1011 (-5)
0000 0000 (0)
👉 特別な「引き算」などを用意しなくても
👉 普通の足し算だけで計算できる



なるほど、だからこの形なんですね



そう。コンピュータ的に都合がいいんだよ
オーバーフローとは?(重要)
整数型には扱える範囲があります。
その範囲を超えると「オーバーフロー」が発生します。
■ 例
unsigned char a = 255;
a = a + 1;結果👇
255 → 0
👉 値がループする



え、エラーにならないんですか?



ならない。だから危険
■ signedの場合
signed char a = 127;
a = a + 1;👉 -128 になる(環境依存の挙動もあり注意)
👉 気づきにくいバグの原因になる
型の使い分け(実務での考え方)
ここが最も重要です。
■ 基本
- 特に制約なし → int
■ 文字/文字列
- 文字/文字列を扱う場合→char
char型についてはこちらの記事で解説しています。


■ 範囲が決まっている
- 年齢 → unsigned char
- 温度 → short / int16_t
👉 必要な範囲に合わせる
■ メモリを節約
uint8_t buf[1000]; // 1KB
int buf[1000]; // 4KB👉 大きな差になる
■ unsignedを使う場面
- カウンタ
- サイズ
- ビット操作
⚠️ 注意
unsigned short a = 1;
if (a < 0) // unsignedでは成立しない■ 組み込みでの考え方
- メモリ制約
- 通信仕様
- ハードウェア制御
#include <stdint.h>
uint8_t buf;
int16_t value;👉 サイズを意識した設計が重要
さらに場合によっては浮動小数点型の使用も検討します。
浮動小数点型についてはこちらの記事で解説しています。


まとめ
- 整数型はビット数で範囲が決まる
- signed / unsigned で扱える値が変わる
- 負の数は2の補数で表現される
- オーバーフローに注意
- 型は用途に応じて選ぶことが重要
C言語学習におすすめの書籍
新・明解C言語 入門編
整数型の扱いを理解するには、
まずC言語のの基礎理解が重要です。
この書籍は、
- 配列
- ポインタ
- static変数
- 文字列
- 関数
などを図やサンプルコードを使いながら丁寧に学べます。
「変数がどこに置かれるのか」
「なぜメモリ領域が分かれているのか」
を理解する土台を作りたい方におすすめの1冊です。
この記事が参考になった方へ
型を含むC言語の基本文法をこちらの記事で整理しています。


技術に関するご相談・開発・自動化ツール作成・記事執筆などのご依頼も承っています。
小さなご相談からでもお気軽にご連絡ください。

コメント