C言語基礎|7章のまとめ

第7章で学んだ「型・ビット・定数・変換」を一気に整理!―“迷わないC”のための総まとめ。

第7章は、C言語の土台になる話がぎゅっと詰まった章でした。
型の分類、ビット表現、ビット演算、定数の書き方、オーバフロー、浮動小数点、そして型変換ルールまで。

ここで大事なのは、項目をバラバラに覚えることじゃなくて、

  • なぜそのルールがあるのか
  • どこで実際のバグにつながるのか
  • どの知識が次の知識の前提なのか

この“つながり”を作ることです。
そのために、表と小さな図で「全体地図」を作っていきますね。

第7章で扱った内容の全体マップ

まずは章全体を、テーマごとにまとめます。

第7章のテーマ一覧(何を学んだ章だった?)

テーマ何が分かるようになる?つまずきやすい点
算術型の分類整数型と浮動小数点型の違いが説明できるchar が整数扱いなこと
整数型の signed/unsigned負数があるかないかが変わるsigned/unsigned 混在の比較
表現範囲と limits.hその型の最小・最大が確認できる環境で値が違うこと
sizeof と size_t型のサイズを安全に扱えるsize_t が unsigned 系
typedef型名の別名を作れる読みやすさと乱用の境目
ビット表現0/1 の並びが値になる仕組み符号付きの表現方式
ビット演算・シフトフラグ操作や高速化ができる負数シフトの処理系依存
定数(整数/浮動小数点)10進/8進/16進、接尾語が使える013 の罠、L と l
オーバフローsigned は危険、unsigned は剰余signed のオーバフローの扱い
浮動小数点の誤差0.1 が正確に表せない理由繰返し制御に使う危険
演算子の優先順位・結合性式の解釈が読める思い込みの優先順位
整数拡張と通常の算術型変換型が勝手に変わる理由が分かるunsigned に寄る事故

表の説明
この表は「第7章の要点」を“目的ベース”でまとめたものです。
右端の「つまずきやすい点」を見ておくと、復習の効率が一気に上がります。

算術型の分類:まずはここがスタート

第7章の最初に押さえたいのは「算術型」の分類です。

主要な算術型

分類中身代表例できること
整数型連続した整数(有限範囲)char, short, int, long, long long, enumビット演算、正確な整数計算
浮動小数点型実数を近似で表すfloat, double, long double小数計算、広い範囲の値

表の説明
整数は「正確」、浮動小数点は「近似」です。
この違いが、繰返し制御や比較で大きな差になります。

signed と unsigned:同じビットでも意味が変わる

図:同じビット列でも読み方が変わる(文章図)

図の説明
ビット列は同じでも、signed/unsigned の“解釈ルール”が違うので値が変わります。
この意識があると、バグの原因が追いやすくなります。

signed/unsigned の違い(超要点)

観点signedunsigned
負数扱える扱えない
範囲だいたい半分が負側に割り当て0 から最大まで
オーバフロー危険(環境依存・想定外になりやすい)剰余で回る(規則が明確)

表現範囲と limits.h:数字は“確認”できる

処理系依存の値は、limits.h にまとめられています。

よく使う limits.h の代表

マクロ意味使う場面
INT_MIN, INT_MAXint の最小/最大オーバフロー対策、入力チェック
UINT_MAXunsigned int の最大剰余計算の理解
CHAR_BITchar のビット数ビット列処理、可搬性確認

表の説明
「この環境の int は何ビット?」みたいな話は、推測せず limits.h で確認するのが基本です。

sizeof と size_t:サイズはこの2つで語る

sizeof の要点

項目内容
sizeof が返す型size_t
size_t の性質符号無し整数型
何を測る型やオブジェクトのバイト数

表の説明
サイズは負にならないので、size_t が unsigned 系になっています。
このせいで比較時に unsigned に寄る事故が起きやすいので、頭の片隅に置いておくと安心です。

typedef:型の別名で読みやすくする

typedef の基本

書式意味
typedef 既存型 新しい名前;型の別名を作る

何をする命令なのか
typedef は「新しい型を作る」ではなく、「別名を作る」宣言です。
読みやすさのために使うのが王道です。

ビット演算とシフト:フラグ操作の基本道具

ビット演算子(超頻出)

演算記号何をする?よくある用途
AND&両方1のビットだけ1指定ビットだけ取り出す
OR|どちらか1なら1指定ビットを立てる
XOR^片方だけ1なら1指定ビットを反転
補数~全ビット反転マスク作り、反転

シフト演算子

演算子形式何をする?
<<a << b左に b ビットずらし、空きは0
>>a >> b右に b ビットずらす

注意(まとめとして大事)
負数の右シフトは、論理シフトか算術シフトかが環境依存になりやすいので、原則避けるのが安全です。

整数定数と接尾語:見た目で型が変わる

整数定数の基数

表記意味
10進1310進の13
8進01310進の11(先頭0)
16進0x1210進の18(0x)

整数接尾語

接尾語意味
Uunsigned を明示
Llong を明示
LLlong long を明示

表の説明
接尾語は「この定数はこの型として扱ってね」という指示です。
数字の大きさと接尾語と環境の範囲が組み合わさって、最終的な型が決まります。

オーバフロー:signed と unsigned で世界が違う

オーバフローのまとめ

範囲を超えたら?まとめの一言
signed想定外になりやすい(環境依存の挙動に触れやすい)できるだけ起こさない設計
unsigned最大値+1 で割った剰余になるルールが明確で予測しやすい

表の説明
unsigned は“ぐるっと回る”ルールがあるので、挙動が読めます。
signed は「超えない」ように作るのが基本方針です。

浮動小数点:正確さより“扱える範囲”と“精度”

浮動小数点型の特徴

ざっくり特徴使いどころ
float軽いが精度は低めメモリ節約、軽量計算
double標準的で扱いやすい基本はこれ
long double精度や範囲を増やせることがある高精度計算

重要:繰返し制御に浮動小数点を使うと危険

  • 0.01 を100回足しても 1.0 にならないことがある
  • そのせいで、等しい比較でループ終了しないことがある

だから、繰返しのカウンタは整数にするのが基本です。

演算子の優先順位・結合性:読み方のルール

第7章で特に重要な優先順位(よく使うものだけ)

だいたいの順(高→低)ポイント
単項(! ~ ++ -- (型) sizeof)!x, ~xまず単体に効く
乗除剰余a * b, a / b, a % b+ より先
加減a + b, a - bいつもの算数
シフトx << n, x >> nさらに下
比較< <= > >=真偽になる
等価== !=比較より後
ビットAND/XOR/OR& ^ |論理とは別物
論理AND/OR&& ||短絡評価あり
代入= += -= ...右結合

表の説明
「思い込みで読む」と間違えやすいので、式は括弧で意図を固定するのが安全です。

整数拡張と通常の算術型変換:勝手に型が変わる理由

まとめとして一言で言うと、

  • 小さい整数は計算前に持ち上げられる(整数拡張)
  • 2項演算では左右の型をそろえる(通常の算術型変換)

この2段構えがあるから、signed/unsigned 混在で事故が起きます。
ここまで理解できていれば、第7章の狙いはかなり達成できています。

サンプルプログラム(まとめ確認用)

章の要点を「一度に軽く確認できる」シンプルなプログラム例です。

プロジェクト名:chap7-29-1 ソースファイル名:chap7-29-1.c

#include <stdio.h>
#include <limits.h>

int main(void)
{
    int a = INT_MAX;
    unsigned int b = 1U;

    printf("第7章まとめチェック:型と範囲を確認します。\n");
    printf("INT_MAX は %d です。\n", a);

    // unsigned の “回る”挙動を軽く観察(例として UINT_MAX を使う)
    unsigned int u = UINT_MAX;
    printf("UINT_MAX は %u です。\n", u);
    printf("UINT_MAX に 1 を足すと %u になります。\n", u + 1U);

    // sizeof と size_t(unsigned 系)を意識する
    printf("int のサイズは %zu バイトです。\n", sizeof(int));
    printf("double のサイズは %zu バイトです。\n", sizeof(double));

    // ビット演算の超ミニ確認
    unsigned int x = 6U;  // 0110
    printf("x = 6 のとき、x | 1 は %u です。\n", x | 1U);

    return 0;
}

登場する命令(書式)と、何をする命令なのか

printf

書式
printf(書式文字列, 引数1, 引数2, ...);

何をする?
値を表示します。まとめ確認では「環境依存の値を目で見る」目的で使います。

sizeof

書式
sizeof(型)
sizeof 式

何をする?
型やオブジェクトのバイト数を返します。返り値は size_t です。

演算子(+ や | など)

書式
a + b
a | b

何をする?

  • は算術演算、| はビット単位ORです。
    同じ “OR” でも || とは別物なので注意、というのが第7章の重要点でした。