C言語入門|整数型で気をつけるべきこと:型の選び方とオーバーフローの仕組み

C言語の整数型といえば「char・short・int・long」の4種類。
すでに代表的な型について学びましたが、整数型を扱うときには重要な注意ポイントがあります😊

  • どの型を選べばいいの?
  • int だけ使えばダメなの?
  • すごく大きい数を入れたらどうなるの?
  • オーバーフローって何?

こうした疑問を、図と表を使いつつわかりやすく解説していきます🌟

🔢 まず押さえたい!整数型は「基本 int」でOK

昔のコンピュータはメモリもCPUもとても貧弱で、
「少しでも軽い型を使って節約する必要があった」ため、
char や short が多用されました。

しかし、いまのコンピュータは処理性能が十分に高く、

🌟 基本方針

整数を扱いたいときは、とりあえず int を使えば安心!

というのが現代的で実用的な型選びのコツです😄

🔍 読みやすさUP!桁区切り記号の活用

大きな値をコードにそのまま書こうとすると、桁の見間違いが起こりやすくなります。

そこで便利なのが「桁区切りの一重引用符」。
(実行時には無視されるので動作に影響はありません)

int population = 121270000;
int population2 = 121'270'000;   // こちらの方が読みやすい!

どこに区切りを入れても OK なので、読みやすさを優先して使いましょう🌸

🌈 unsigned 型とは?

整数型には、unsigned int、unsigned char のように
unsigned を付けた派生型も存在します。

✔ unsigned の意味

  • マイナスを使わない整数型(非負の整数専用)
  • そのかわり、扱える最大値が増える!

通常の最大値unsigned の最大値
char127255
int約21億約42億

マイナスが不要な場面(配列の添字、個数など)では unsigned 系を使うことがあります😊

💥 ここが重要!オーバーフローとは?

整数型には必ず
「入れられる範囲」 が決まっています。

この範囲を超えた値を代入しようとすると……

🧨 オーバーフロー(overflow) が発生します!

しかも、C言語ではここが超危険ポイント ⚠️
オーバーフローしてもエラーは出ず、
壊れた値になり、そのまま実行が続いてしまう ことがあるのです。

💻 サンプルコード

char 型の最大値である 127 を超える値を代入してみます。

プロジェクト名:2-4-1 ソースファイル名: sample2-4-1.c

#include <stdio.h>

int main(void)
{
    char value = 150;    // char に入らない値を代入
    printf("value の中身は %d です\n", value);

    return 0;
}

📝 printf の書式と理由

ここでは

printf("value の中身は %d です\n", value);

を使っています。

  • %d は 「数値(整数)」として表示するフォーマット指定子
  • char 型でも、整数として解釈して表示できる
  • \n は改行

printf は画面に数値や文字を表示する命令で、C 言語の基本中の基本です✨

🌀 column:オーバーフローが輪のようにつながる?

オーバーフローの結果は

「めちゃくちゃな値に勝手に変わる」のではなく、
内部的には次のように循環している場合があります。

🔄 値の循環イメージ(char の例)

127 → オーバーすると → -128 → -127 → ... → 0 → 1 → ...

つまり、上限を超えた分だけ下限側から進む「輪」のようになっているわけです。

ただし重要ポイント ⚠️

C言語ではオーバーフローの挙動は “未定義"
たまたま循環しているように見えるだけで、
実際には壊れた値になることもあります。

だからオーバーフローを利用するプログラムは絶対に書かないようにしましょう😣

📊オーバーフローのイメージ

      (正の最大値)
          127
           ↑
           |
0 → 100 → 127 → -128 → -100 → -56 → …
                  |
                  ↓
            (負の最小値)

こうした「つながり」を理解しておくと、
なぜ不思議な値が出てくるのかが見えてきます👀✨

📘 まとめ:整数型の安全な使い方

注意点説明
基本は int を使うchar や short は特殊用途
大きな値は桁区切りを使う121'000'000 のように読みやすく
オーバーフローは危険結果が壊れる&エラーにならない
unsigned 型はマイナス不要な場合に便利ただし使いすぎに注意
型のサイズは環境で異なることもsizeof で確認できる