📦 変数・型・演算子
🎯 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 で測ります。
まとめ
int は多くの環境で32ビット、範囲はおよそ ±21億。限界値は limits.h の INT_MAX / INT_MIN。足りないときは long long、負が不要なら unsigned int。小数は入らず、黙って切り捨てられます。
関数の宣言など、複数のファイルで共有したい情報をまとめた.hという拡張子のファイルのこと。#includeで取り込んで使う。#include <stdio.h>のstdio.hが、まさにこのヘッダファイルにあたる。
printfやscanfで使う%dや%fのような記号のこと。続けて渡す値をどんな型・どんな見た目として扱うかを指定する役割を持つ。指定する型と実際に渡す値の型がずれると、思わぬ表示結果になることがある。
型が表現できる範囲を超えた値を扱おうとして、値がおかしくなってしまう現象のこと。整数型では想定外に小さい値へ化けることがある。int型の最大値に1を足すと、最小値付近の値へ回り込んでしまうことがある。
もっと先へ:ポインタ・メモリ・ファイル入出力・セキュアコーディングを含む全26トラックと、段位検定・模試のフルセットは完全版に収録しています。