数字の'1'と数値の1

目次
  • 解説
  • 1. 数字とは
  • 2. 数字と数値
  • 3. 整数型:int型
  • 4. 下限と上限
  • 5. その他の表記
  • 6. このページで学習した型
問題に挑戦!
進捗を変更する




解説

1. 数字とは


数字とは一般的に下表のような種類があり、文字列の中(シングルクォーテーションの中)ではどれも自由に使用可能です。

数字の種類0~10の表記例
半角アラビア数字0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10
全角アラビア数字0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10
全角大文字ローマ数字Ⅰ, Ⅱ, Ⅲ, Ⅳ, Ⅴ, Ⅵ, Ⅶ, Ⅷ, Ⅸ, Ⅹ(0の表記無し)
全角小文字ローマ数字ⅰ, ⅱ, ⅲ, ⅳ, ⅴ, ⅵ, ⅶ, ⅷ, ⅸ, ⅹ(0の表記無し)
全角漢数字零, 一, 二, 三, 四, 五, 六, 七, 八, 九, 十

プロジェクト内のフォルダー名やファイル名、クラス名やメソッド名などのプログラム内で固有名詞として使用される文字識別子)では、半角アラビア数字のみが、それぞれの命名規則の範囲内で使用可能です。

ローマ数字は大文字も小文字も全角1文字と同じ扱いとなります。アルファベットを組み合わせて代用して表現することは可能ですが、通常のアルファベットとの混乱を招くため避けましょう。

2. 数字と数値


数字を文字列や識別子の一部としてではなく、計算などに使用する数値そのものとして扱いたい場合には、クォーテーションなどで括らずそのまま使用します。

    public static function practiceNumberAndNumeric() {
        Logger::echo('1' . '2' . '3' . '4' . '5'); // 文字列の結合
        Logger::echo(1 + 2 + 3 + 4 + 5); // 数値の加算
    }
[2022/12/31 12:34:56] 12345 // 文字列の結合
[2022/12/31 12:34:56] 15 // 数値の加算

3. 整数型:int型


変数に「整数」を代入して使う場合には、値は半角アラビア数字で表記し、クォーテーションなどでは括りません

    public static function practiceInt() {
        $intValue = 123;
        // Logger::echo(get_debug_type($intValue)); // int
        Logger::echo($intValue);
    }

「int」は英単語の「Integer(インテジャー=整数)」の略称であるため、イント型インテジャー型整数型と呼びます。

整数はマイナスの値も含みますので、次のような計算や代入が可能です。

    public static function practiceInt() {
        $intValue = -1;
        Logger::echo($intValue);
        $intValue = $intValue + -2 + -3; // -1 + -2 + -3 = -6 を代入
        Logger::echo($intValue);
        $intValue = $intValue * 30;      // -6 × 30 = -180 を代入
        Logger::echo($intValue);
        Logger::echo($intValue / 7);     // -180 ÷ -7 = 25
        Logger::echo($intValue % -7);    // -180 ÷ -7 = 25 のあまりの -5
    }

4. 下限と上限


次のサンプルコードを実行してみましょう。

    static function practiceOverflow() {
        $intValue = 9223372036854775807;
        Logger::echo($intValue);      // 「9223372036854775807」が出力される
        $intValue = $intValue + 1;
        Logger::echo((int)$intValue); // 「-9223372036854775808」が出力される!
    }

約922京の整数に1を足した途端、マイナスが付いてしまいました。これはオーバーフロー桁あふれ)と言って、int型の上限値を超過してしまったことが原因です。

int型は内部で「0の次は1、1の次は1繰り上がって10」という2進数64桁でデータを管理しています。また、その先頭の桁は「1ならマイナス、0ならプラス」という符号を表す特殊な桁です。この各桁をビットと呼び、PHPのint型は「符号付き64ビット」である、と言います。

※ビット数はプラットフォームに依存するので、「符号付32ビット」の場合もあります。その場合、約20億5000万がint型の最大値となります。

・・・かなり難解ですので、3ビット単純化した図でこの現象を確認してみましょう。

3桁の「0か1=ビット」の組み合わせ(8パターン)により、「-4」~「3」を表現している、という図です。ビットが「0,1,1」の状態で1を加算すると、ビットが繰り上がって「1,0,0」になってしまい、ルール上「-4」となってしまう、これがオーバーフローです。

この仮数部の桁が増えるごとに「1の位」「2の位」「4の位」「8」「16」「32」「64」と倍々に増えますので、int型では64ビットで「-9,223,372,036,854,775,808」~「9,223,372,036,854,775,807」という大きな数を管理することができるのです。

int型には「0b」を先頭に付けるとビット列を模した形式で代入することが可能です。普段使うことはまずありえませんが、64ビットの場合の確認用コードを載せておきます。

    static function practiceBit() {
        $bitValue =
            0b0000000000000000000000000000000000000000000000000000000000000001;
        Logger::echo($bitValue); // 1
        $bitValue =
            0b0000000000000000000000000000000000000000000000000000000000000010;
        Logger::echo($bitValue); // 2
        $bitValue =
            0b0000000000000000000000000000000000000000000000000000000000000100;
        Logger::echo($bitValue); // 4
        $bitValue =
            0b0000000000000000000000000000000000000000000000000000000010000000;
        Logger::echo($bitValue); // 128
        $bitValue =
            0b0111111111111111111111111111111111111111111111111111111111111111;
        Logger::echo($bitValue); // 9223372036854775807
        $bitValue = $bitValue +
            0b0000000000000000000000000000000000000000000000000000000000000001;
        Logger::echo((int)$bitValue); // -9223372036854775808
    }

5. その他の表記


整数型では、10進数のほかに「2進数」、「8進数」、「16進数」で表記することが可能です。また、可読性を向上するためにアンダースコア(_)を含めることもできます。

    static function practiceOverflow() {
        $intValue = 123;         // 10進数
        Logger::echo($intValue);
        $intValue = 1_2_3;       // 10進数
        Logger::echo($intValue);
        $intValue = 0b1111011;   // 2進数
        Logger::echo($intValue);
        $intValue = 0173;        // 8進数
        Logger::echo($intValue);
        $intValue = 0x7B;        // 16進数
        Logger::echo($intValue);
    }

6. このページで学習した型


読み方
呼び方
用途データ
範囲
intイント型・整数型・
インテジャー型
通常の整数-9223372036854775808 ~ 9223372036854775807
(-2147483648 ~ 2147483647)

問題

確認問題


確認問題

この中で整数を扱う場合の説明として正しいものはどれか?