トラック5・📦変数・型・演算子

int型と整数の世界

読む目安 約11分・ゴール:intの範囲と限界値の調べ方を知り、long long・unsignedの使いどころが分かる

アプリでこのトピックを学ぶ(無料・登録不要)

このトピックの要点

整数はプログラムでいちばんよく使う値です。個数、点数、年、回数。それを入れる基本の箱がintです。

int の大きさと範囲

多くの環境で int は4バイト=32ビットです。32個の0と1で表せる組み合わせは約42億通り。半分を負の数に使うので、扱える範囲はこうなります。

-2147483648 〜 2147483647(およそ ±21億)

限界値は暗記せず、調べられるようにしておきます。

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

int main(void) {
    printf("intの最大 %d\n", INT_MAX);
    printf("intの最小 %d\n", INT_MIN);
    return 0;
}

limits.h というヘッダファイルに、その環境の限界値が用意されています。数字を覚えるより、INT_MAX と書けるほうが実務的です。

int の仲間たち

・short … おおむね2バイト。小さい整数用。
・long long … 8バイト。約 ±922京。21億で足りないときはこれ。
・unsigned int … 負を捨てる代わりに、0〜約42億まで使える。

#include <stdio.h>

int main(void) {
    int       tsuujou = 1234;
    long long ookii   = 9000000000LL;    // 90億。int には入らない
    unsigned int seinomi = 4000000000U;  // 40億。unsigned なら入る

    printf("%d\n", tsuujou);
    printf("%lld\n", ookii);
    printf("%u\n", seinomi);
    return 0;
}

型が変われば書式指定子も変わります。long long は %lld、unsigned int は %u です。ここを間違えると表示だけが壊れるので、値がおかしいときは書式も疑います。

動く例——整数だけで計算する

#include <stdio.h>

int main(void) {
    int nedan = 480;
    int kosuu = 7;
    int goukei = nedan * kosuu;

    printf("合計 %d 円\n", goukei);
    printf("3人で割ると 1人 %d 円\n", goukei / 3);
    return 0;
}

合計は3360円、3人で割ると1120円。ちょうど割り切れましたが、割り切れないときは小数にならず切り捨てられます。これは大きな事件なので、専用のトピックで扱います。

罠・注意

21億を超えると壊れる。 秒数やバイト数の合計、掛け算の結果は意外と簡単に超えます。何が起きるかはこのトラック最後のオーバーフローのトピックで見ます。

小数は入らない。 int n = 3.9; は 3 です。四捨五入ではなく切り捨て。

int の大きさは環境で変わりうる。 「必ず4バイト」ではありません。知りたいときは sizeof で測ります。

ビット「21億もいらないでしょ」と思ったところが、あとで事故になるんだ。合計や積を作るときだけは桁を意識してみて。

まとめ

int は多くの環境で32ビット、範囲はおよそ ±21億。限界値は limits.h の INT_MAX / INT_MIN。足りないときは long long、負が不要なら unsigned int。小数は入らず、黙って切り捨てられます。

アプリでこのトピックを学ぶ(無料・登録不要)

確認問題

確認問題 1

多くの環境で int(4バイト)が扱える範囲に最も近いものはどれですか。

  1. -128 〜 127
  2. 0 〜 65535
  3. 約 -21億 〜 21億
  4. 約 -922京 〜 922京
答えを見る

正解:C(約 -21億 〜 21億)

4バイト=32ビットで表せる組み合わせは約42億通り。半分を負の数に使うので、およそ -21億〜21億になります。-128〜127 は char、約±922京は long long の範囲です。正確な値は limits.h の INT_MAX / INT_MIN で確認できます。

確認問題 2

一般的な環境での出力はどれですか(/は改行を表します)。

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

int main(void) {
    int n = INT_MAX;
    printf("%d\n", n);
    printf("%d\n", n / 2);
    return 0;
}
  1. 2147483647/1073741823
  2. 2147483647/1073741824
  3. 4294967295/2147483647
  4. 2147483648/1073741824
答えを見る

正解:A(2147483647/1073741823)

INT_MAX は 2147483647 です(2147483648 ではありません。0を含めるぶん1つ少なくなります)。2で割ると 1073741823.5 ですが、int どうしの割り算なので小数点以下は切り捨てられ 1073741823 になります。4294967295 は unsigned int の最大値です。

「変数・型・演算子」の目次

  1. 変数とは名前付きの箱
  2. int型と整数の世界
  3. 浮動小数点数 float / double
  4. char型と文字コード
  5. bool型と真偽——C23標準の書き方
  6. 定数——const と constexpr
  7. 算術演算子と優先順位
  8. 整数の割り算と剰余の罠
  9. 型変換——暗黙と明示
  10. 2進数・16進数リテラル(0b / 0x / 桁区切り')
  11. sizeofとメモリ上のサイズ
  12. オーバーフローという事件

もっと先へ:ポインタ・メモリ・ファイル入出力・セキュアコーディングを含む全26トラックと、段位検定・模試のフルセットは完全版に収録しています。

完全版の販売ページは準備中です。

ほかのトラック

📚 姉妹教材:手を動かして覚える Linux 教材 — Linuxとインフラの仕組みを地図で学ぶ

Web版