【マンガで感じる】整数 ~型ごとに限界値が異なる整数~ 【本当の基礎から学ぶゲームプログラミング】


2026/08/10

40年以上のゲームプログラミング経験をマンガで可視化。 今回は「整数」。 プログラムで扱う整数は「型」(かた)ごとに限界値と符号の有無が異なります。 データ型と整数型、および関連してオーバーフローやキャスト、真偽値なども解説します。

プログラミングブログ記事一覧
[PR]
【マンガで感じる】整数 ~型ごとに限界値が異なる整数~
[PR]
「データ型」とは:データの種類と表現形式
「データ型」(でーたがた)とは、「データの種類および表現形式」のことです。 単に「型」(かた)とも呼びます。
コンピューターが扱うデータには、整数や小数、真偽値など、様々存在します。 それらは主に、デジタルデータの基本単位であるバイトを組み合わせて表現します。
それがどのようなデータであり、どう組み合わせて表現するかを規定するのが「データ型」です。
本エピソードでは、そのデータ型のひとつ「整数」を解説します。 また、「真偽値」についても本エピソードで解説し、その他もデータ型編で解説します。
「整数」とは:型ごとに限界値が異なる整数
プログラムが扱う「整数」の本質は「型ごとに限界値が異なる整数」です。
多くのプログラミング言語で扱う整数は、数学で扱う無限の整数と異なり、扱える値の限界値が規定されています。 その限界値は、型によって決まります。
符号の有無、すなわちマイナスがあるかどうかも、型で決まります。
C++ の整数型の例
まずは、整数型の内部構造がわかりやすい C++ の例を用いて、詳細に解説します。
型名
バイト数
整数値の範囲
int8_t 1
-128~127
uint8_t 1
0~255
int16_t 2
-32768~32767
uint16_t2
0~65535
int32_t 4
±約21億
uint32_t4
0~約43億
int64_t 8
±約922京
uint64_t8
0~約1845京
変数定義
C++ における変数定義は、例えば以下のようにプログラミングします。
#include <cstdint>
// (中略)
uint16_t i;
i は uint16_t 型の変数」であることを定義しています。
コンパイラ(ソースコードを CPU が読める機械語に変換するプログラム)は、変数 i のための領域として、uint16_tに必要な 2バイトを確保する機械語コードを出力します。なお、この
uint16_t などの定義を使用する場合、#include <cstdint> が必要です。
また厳密には std::uint16_t など std:: を付けて記述すべきですが、
ここでは許容されている省略形で解説しています。ビット数指定
型名に書かれている数字はビット数を表します。
ビット数が増えればデータサイズ(バイト数)も増えて、表現できる値の範囲も広がります。 例えば
uint8_tなら 8ビット(1バイト)で、表現できる範囲は 0 から 255 です。マンガでは、各バイト班が 1バイトずつ処理していますが、前エピソード「バイト」の通り、それぞれ 8ビットです。 そして10000を表現するには2バイト必要なことが、前述の表からわかります。
int(符号あり) と uint(符号なし)
2進数
16進数
int8_tuint8_t00000000
0x00
0
0
01111111
0x7F
127
127
10000000
0x80
-128
128
11111111
0xFF
-1
255
int8_t (signed/サインド/符号あり) と uint8_t (unsigned/アンサインド/符号なし)の例です。
それぞれ符号付き整数型、符号なし整数型などと呼びます。符号ありの場合、原則として、そのデータの最上位ビットが立っていれば(1ならば)、マイナスという扱いです。 符号なしの型は、必ず 0 以上の値を取ります。
char,short,long:既定の整数型
型名
主なバイト数
char 1
short 2
long 4または8
long long8
char,short,long が既定の整数型です。ただし、仕様としてそのデータサイズ(バイト数)が明確には規定されていません。 例えば 64ビット環境における
long は、Windowsだと 4バイト、Linuxだと 8バイトなどの差異があります。符号のあり・なしは、
signed と unsigned を前に付けて区別します。
signed char や unsigned char などと書きます。
省略した場合は signed ですが、char は unsigned がデフォルトの場合もあります。このように、環境により様々異なります。 そのためビット数と符号の有無を明確に意識する場合には、標準化された
cstdint 用いて int8_t などを使用した方が良いでしょう。筆者のゲームプログラミング経験では、標準化される前の段階でも、対象の家庭用ゲーム機ごとに異なる場合があるため、
int8_t 等に相当する「ビット数指定で変数等の定義ができる仕組み」を、独自に用意するなどしていました。int:基本の整数型
特にデータサイズを意識しなくて良い場合の整数型には
int を使用します。int のバイト数は、ABI(Application Binary Interface) と呼ばれる仕様に従い、コンパイラが割り当てます。筆者は 16ビットCPU環境で
int が 2バイト(16ビット)だった時代のプログラミング経験があります。
当時は基本的に CPU に適したバイト数でした。その後、32ビットCPU環境で 4バイト(32ビット)になりました。 ただし、現在は 64ビットCPU でも、多くのコンパイラが 4バイト(32ビット)を割り当てます。
これは、現存する膨大なプログラム資産が「
int は 4バイト」という前提で作られていて、64ビットCPU環境に移植しやすい配慮だと思われます。
そのため今後も intは 4バイトの認識で問題ないと考えます。主要なプログラミング言語の整数型
C++ 以外の主要な言語の整数型についても解説します。
この観点においてプログラミング言語は「静的型付け言語」と「動的型付け言語」に分類されます。
静的型付け言語(C#,Java等)
静的型付け言語は、プログラムでデータ型を指定する言語です。
前述の C++ および、C# や Java など、ゲームプログラミングで主流の言語はこちらです。
例えば
int8_t に相当する型が、C# では sbyte 、Java では byte など、具体的なワードは異なりますが、基本的な考え方は同じです。
ただし Java には符号なし整数型が無いなど、言語ごとの特徴はあります。動的型付け言語(JavaScript,Python等)
動的型付け言語は、ソースコードではデータ型を指定せず、実行時に自動的に判断して割り当てる言語です。
例えば JavaScript では、変数に数値が代入されると
number型と判断されます。
実体は倍精度浮動小数点数型です。また Python では、整数値についてはデータサイズが可変で、限界値がありません。
なおどちらも原則です。 最適化する場合等で、それぞれデータサイズを指定したプログラミングも可能です。 また JavaScript にも、限界値の無い整数が用意されています。
ゲームプログラミングにおける「整数」
ゲームプログラミングにおいて整数は、頻繁に使用するデータ型です。
プロのゲームプログラミングにおいて、データ量および、その型の整数が表現できる値の範囲を意識することは重要です。
筆者の経験上は、プランナーやディレクターと相談して、データサイズ側の都合を優先し 255 や 65535 が上限のゲーム仕様にしてもらうことも少なくありません。 また、4バイトの符号なし整数の場合は 43億近くまで表現できますが、99億は表現できないので、人間のわかりやすさのため 9億 (999,999,999) を上限とするなどします。
このように、ゲームプログラミングの際には、ゲーム仕様としての必要度合いと、プログラミングの実装難易度などを比較検討して、決めていく必要があります。 片方の都合だけで判断してはいけません。
「エンディアン」とは:複数バイトを整数値にする順番の規定
複数バイトの整数を扱う際には順番の規定があります。 これをエンディアンと呼び、上位バイトから並べる「ビッグエンディアン」と、下位バイトから並べる「リトルエンディアン」という2種類が存在します。 メモリー上の生データを直接確認する場合には注意が必要です。
エンディアンはゲーム機ごと、あるいはコンピューターのCPUおよび設定ごとに決まっていて、最近はリトルエンディアンが主流です。 ただし、過去にはビッグエンディアンが主流の時代もありました。
ビッグエンディアン
マンガでは、メカ・ヘキサバイトたち、すなわち1バイトの16進数がそれぞれ
0x00 0x01 の時に、0x0001 として 1 と読みました。このように、データが上位バイトから並んでいるとして数値を扱う形式を「ビッグエンディアン」と呼びます。
データの並びを人間が見た時に読みやすい形式です。 そのためマンガではわかりやすさを優先して、最近の主流ではありませんが、ビッグエンディアンを採用しました。
リトルエンディアン
ビッグエンディアンとは逆順、すなわち、
0x01 0x00 で 0x0001 を表す形式が「リトルエンディアン」です。リトルエンディアンであれば、例えば 2バイト整数が実質 1バイトに収まっている時に、1バイト整数として扱い
0x01 だけを使って 1 と解釈できるという、上手に使えばメリットになる特徴があります。CPUの実装において、筆者はハードウェアの専門家ではないので詳しくはありませんが、桁上りと読むべきデータの方向が一致しているため、この方が処理しやすいメリットもあるようです。
「オーバーフロー」とは:限界超過
整数値が、その整数型の限界を超えた場合、オーバーフローします。
具体的には例えば、
uint8_t の 0xFF から 1 増えると 0x00 になります。
10進数で書き直すと 255 から数字が増えたはずなのに 0 になってしまいます。また、
int16_t の 0x7FFF から 1 増えると 0x8000 になります。
これは、+32767 から数字が増えて -32768 になるオーバーフローです。※厳密には言語仕様上は未定義で結果が保証されていませんが筆者の経験では事実上こうなります
2038年問題
UNIX時間と呼ばれる、現在時刻を協定世界時1970年1月1日0時0分0秒からの経過秒数で表現する形式があります。
その秒数は、符号あり32ビット整数で持ちます。 つまり、経過秒数が
0x7FFFFFFF までは良いですが、そこから 1秒進んで 0x80000000 になるとマイナス値となるため、突然、時間が巻き戻ることになります。そのタイミングが 2038年1月19日 に訪れるため、これは「2038年問題」と呼ばれます。
64ビット整数化すれば、問題を千億年以上先送りにできますので、現在はその対応が進んでいます。 しかし万が一 32ビット整数のままのものが残ってしまった場合、そしてそれが重要な役割を担っていた場合、世界が大混乱に陥る可能性があります。
以前に2000年問題として、1999年から2000年になるときに起きる問題が取り上げられたことがありました。 筆者が当時見た不具合は、19XX年の形式で処理していて、表示が「1999年」から「19100年」になってしまうものでした。 これは表示だけの問題で、内部的には正しく時が進んでいます。
一方 2038年問題は、内部データの日時が巻き戻るため、例えば「有効期限180日」などの処理が正しく判定できなくなるなどの影響を与えます。 そのため 2038年問題の方が 2000年問題より深刻だと、筆者は個人的に考えています。
割り切れない整数の除算も整数
ゲーム開発で主流の C++ や C# など、整数型を持つ多くのプログラミング言語では通常、
整数 / 整数 は整数値になります。具体的には例えば C++ にて
std::cout << 3/2 << std::endl; とすると、出力は 1 です。
(1.5ではありません)この動作をするプログラミング言語では、整数型と整数型の演算結果は整数型という仕様です。 ただし Pythonはバージョン2までは整数、3以降は小数になり
// が整数除算になるなど、プログラミング言語やそのバージョンでも差異があり、注意が必要です。そのようなプログラミング言語において、小数の結果が必要な場合は浮動小数点数等を明示的に使用する必要があります。
「キャスト」とは:データ型変換
一部のプログラミング言語には「キャスト」という、データ型変換の処理があります。
プログラムで指定する明示的なキャスト以外に、指定しなくても自動的に行われる暗黙のキャストもあります。
暗黙のキャスト
以下のプログラムは整数型同士の代入ですが、データ型が異なるため暗黙のキャストが動きます。
C++
std::uint16_t i = 4; std::uint32_t j = i;
i と j はデータ型が異なりますが、この代入はエラーにならず正常に動作します。2行目では、変数
iの内容が 0x0004 から暗黙のキャストで自動的に 0x00000004 になり、 jに入ります。明示的なキャスト
以下のプログラムのように明示的にキャストすることも可能です。
C++
char c = 0x80; std::uint16_t iA = c; // 0x0080 または 0xFF80 std::int16_t iB = static_cast<signed char>(c); // 0xFF80 (-128) std::uint16_t iC = static_cast<unsigned char>(c); // 0x0080 (128)
char に代入している 0x80 は、符号ありなら -128、符号なしなら128です。
※環境によっては警告対象のプログラムです整数型同士でデータサイズを拡張する場合、符号ありの整数型からの拡張は上位の空きビットすべてを元の符号ビットと同じ値(
0x80 なら 1) で埋めることで、
プラスの値はプラス、マイナスの値はマイナスのままになります。
そのため、この例のように、符号あり・なしで、実際のデータは異なる結果になります。char型は、環境によってデフォルトの符号あり・なしが異なり、
明示的なキャストをしないと、意図しない整数値になる可能性があります。筆者の経験上は、
char に限らず、正しくキャストしていなかったことで不具合になったケースは珍しくありません。「真偽値」とは:真または偽
「真偽値」 は、真または偽の値です。
C++ および C# では
bool で、Java は boolean で定義します。値は
true または false です。
Python では True と False など、プログラミング言語で異なります。C++ の
bool について、仕様上データサイズは規定されていませんが、現行環境では事実上 1バイトです。
内容は true が 1、falseが 0 です。【職人の視点】char が 8ビット以外の特殊環境
C++ の規定では、
char は常に 1バイトです。ただしその「1バイト」は、
CHAR_BITの値によります。
通常は 8 ですが、16 や 32 の環境もあります。
32の場合 1バイトが 32ビットのため、charで定義された変数のデータサイズも 32ビットです。
その場合でも sizeof(char) (char のデータサイズ) は 1(=1バイト)です。これはゲームプログラミング視点では特殊な環境のため、本シリーズでは「1バイトは8ビット」として進めます。
[PR]
マンガで感じる!本当の基礎から学ぶゲームプログラミングとは
「マンガで感じる!本当の基礎から学ぶゲームプログラミング」シリーズでは、 主に、ゲーム開発を題材として、プログラミング時に筆者が脳内でイメージするコンピューター内部動作や本質を、マンガにてお伝えします。
プログラミングの本質をマンガで理解
AI時代のプログラミングは、本質理解が重要です。 本質を理解していれば、あとはAIに任せて、自身を持って完成したプログラムに責任が持てるでしょう。
そのため本シリーズでは、コーディングの実例や詳細よりも、「本質をイメージとして感じられること」を最優先としています。 まずマンガで、情報をできる限り絞り、プログラミングの仕組みやコンピューターの内部動作を、物理的に可視化してお届けします。
そして文章の解説で徹底的に深掘りします。
登場人物紹介
マンガで感じる!本当の基礎から学ぶゲームプログラミングシリーズには、主に社長、クリスタル、およびメカたちが登場します。
※実在の人物とは関係ありません社長
本シリーズの偉い人です。マンガでは、指示すなわち「要件定義」を行います。
クリスタル
社長の指示を、メカを活用して解決します。名前は、コンピューター内部で指揮者の役割を果たす「水晶発振器」に由来します。
メカたち
用途に応じて多数存在し、果たす役割がそれぞれ与えられています。クリスタルの指示に従い、ある時はプログラムの変数や関数のように、ある時はデジタル回路の素子や部品のように振る舞います。
「マンガで感じる!本当の基礎から学ぶゲームプログラミング」にかける想い
筆者が本シリーズにかける想いや、 より詳しいコンセプトは「マンガで感じる!本当の基礎から学ぶゲームプログラミング」にて語っています。 そちらもぜひご覧ください。
本エピソードから読み始めた方へ
もしあなたがプログラム初心者で、「マンガで感じる!本当の基礎から学ぶゲームプログラミング」シリーズを本エピソードから読み始めた場合は、 ぜひ最初のエピソード「プログラム」から読むことをご検討ください。
AIを専属の家庭教師にして整数を学ぼう
本記事では、型ごとに限界値が異なる「整数」について解説しました。
マンガを読んで興味が湧いた、解説のこのキーワードが気になった、などあれば、AIを専属の家庭教師に見立てて対話してみましょう。 各人の理解度に応じた質疑応答ができて、理解が深まりますので強くオススメします。
皆さまの整数や整数型、およびプログラミングの本質理解に、少しでもお役に立てれば幸いです。
補足
- 本記事に記載のプログラムソースコードは、悪意のない範囲で自由に使用・改変していただいて問題ありません。ただし、ご自身の判断と責任でお願いします。
- 記事内容の検討および検証・添削に生成AIの Anthropic Claude と Google Gemini を利用しております。
- 記事内の画像の作成に生成AIの Google Gemini を利用しております。
- ※各社の登録商標または商標について「®」「™」等の表記はしておりません。
カテゴリー:マンガで感じる!本当の基礎から学ぶゲームプログラミング,【プロ指向者向け】データ型編
[PR]

