数字の'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) |
問題
確認問題
確認問題
この中で整数を扱う場合の説明として正しいものはどれか?