本文へスキップ
BecomeCoder

C#文法コース · 第1章 基礎文法とデータ型 · レッスン4

整数型の仲間とオーバーフロー

ブラウザで完結

導入

intは「約±21億まで」の整数型です。もっと大きい数や、1バイト単位のデータ、1文字を扱うときは、intの仲間であるlongbytecharなどを使い分けます。あわせて、型の上限を超えたとき起こる**オーバーフロー(桁あふれ)**という初心者がハマりやすい落とし穴も押さえます。

図解

flowchart TB
    N["整数型の仲間"] --> B["byte<br/>0〜255(1バイト)"]
    N --> I["int<br/>約 ±21億(4バイト・標準)"]
    N --> L["long<br/>約 ±922京(8バイト・巨大な数)"]
    N --> C["char<br/>1文字(内部は文字コード番号)"]
    style I fill:#e1f5fe

サンプル

long big = 9_000_000_000;   // int の上限(約21億)を超える大きな整数。_ は桁区切り(無視される)
byte small = 255;           // 0〜255 だけを表す1バイトの型
char letter = 'A';          // 1文字。文字は '' で囲む("" は文字列)

Console.WriteLine(big);          // 9000000000
Console.WriteLine(small);        // 255
Console.WriteLine(letter);       // A
Console.WriteLine((int)letter);  // 65 ← 文字は内部に「文字コード番号」を持つ

// オーバーフロー: 型の上限を超えると、値がぐるっと一周してしまう
int max = int.MaxValue;          // 2147483647(intの最大値)
Console.WriteLine(max + 1);      // -2147483648 ← あふれて最小値に戻る(バグの温床)

// checked を付けると、あふれた瞬間に例外で気づける
try
{
    int bad = checked(max + 1);
}
catch (OverflowException)
{
    Console.WriteLine("あふれました");   // こちらが出力される
}
  • longintより桁数の大きい整数、byteは0〜255の小さな整数、charは1文字(''で囲む)
  • 数値リテラルは9_000_000_000のように_で桁区切りできる(読みやすさのためで値には影響しない)
  • 型の上限を超えるとオーバーフローで値が一周する。既定では例外にならず静かに壊れる
  • checked(...)で囲むと、あふれた瞬間にOverflowExceptionで知らせてくれる

演習

// TODO: 100万 × 100万 を計算して出力してください。
//       int 同士だとオーバーフローで壊れるので、long で正しく計算します(答えは 1000000000000)
___
  • 期待される出力: 1000000000000
ヒント1を見る

1_000_000 * 1_000_000 は int 同士なのであふれます。片方を(long)にキャストしてから掛けます

ヒント2を見る

long result = (long)1_000_000 * 1_000_000; Console.WriteLine(result);

まとめ

  • intの仲間にlong(巨大な数)・byte(0〜255)・char(1文字)がある
  • 型の上限を超えるとオーバーフローで値が一周する(既定では例外にならない)
  • 大きくなりうる計算はlongで受ける/危険な箇所はcheckedで守る

次回: 数値を計算する「算術演算子」を使います。

実際に動かしてみよう

本文のサンプルや演習のコードは、コードブロック右上の「コピー」ボタンでコピーして、下のエディタに貼り付ければそのまま実行できます。

C# — ブラウザ内で実行

ブラウザ内でC#を動かす環境を読み込みます(初回のみ数秒)。
スクロールして表示された時点でも自動で読み込まれます。