なぜ08
は範囲外のintと見なされますが、07
以下はそうではない?
Javaおよび他のいくつかの言語)では、0
で始まる整数リテラルは8進数(基数8)として解釈されます。
1桁の数字(許可されない08
および09
以外)の結果は同じであるため、8進数として解釈されていることに気付かない場合があります。ただし、複数の有効数字で数字を書くと、結果が混乱する可能性があります。
例えば:
010 == 8
024 == 20
通常、8進リテラルは必要なものではないので、実際に単独でゼロを書き込もうとしている場合を除き、整数リテラルを0
で始まらないように常に注意する必要があります。
0で始まる番号は8進数と見なされます。 8進数では0〜7の数字しか使用できません。10進数では0〜9を使用でき、2進数では0〜1を使用できます。
// octal to decimal
01 // 1
02 // 2
07 // 7
010 // 8
020 // 16
// octal to binary (excluding most significant bit)
01 // 1
02 // 10
07 // 111
010 // 1000
020 // 10000
10種類の人々があります。三者を理解する人々、理解しない人々、そしてこれが馬鹿げた冗談だと思う人々です。
Java仕様 から:
8進数は、ASCII数字0とそれに続く1つ以上のASCII数字0から7で構成され、正、ゼロ、または負の整数を表すことができます。
Javaで、先頭に「0」を付けてintを定義している場合、Octalで数値を定義していることを示します。
int a = 08は、Octalに数字「8」がないため、範囲外エラーを与えています。 Octalは0〜7の数字のみを提供します。
a = 07を定義すると、数値「0」と「7」が8進数の範囲内にあるため、範囲外エラーは発生しません。
先行ゼロは、値が8進数であることを意味します。 8は8進数ではなく、2進数では2以下、16進数ではGは有効です。