web-dev-qa-db-ja.com

08がJavaで有効な整数リテラルではないのはなぜですか?

なぜ08は範囲外のintと見なされますが、07以下はそうではない?

42
user871303

Javaおよび他のいくつかの言語)では、0で始まる整数リテラルは8進数(基数8)として解釈されます。

1桁の数字(許可されない08および09以外)の結果は同じであるため、8進数として解釈されていることに気付かない場合があります。ただし、複数の有効数字で数字を書くと、結果が混乱する可能性があります。

例えば:

010 ==  8
024 == 20

通常、8進リテラルは必要なものではないので、実際に単独でゼロを書き込もうとしている場合を除き、整数リテラルを0で始まらないように常に注意する必要があります。

65
Stuart Cook

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種類の人々があります。三者を理解する人々、理解しない人々、そしてこれが馬鹿げた冗談だと思う人々です。

14
cwallenpoole

Java仕様 から:

8進数は、ASCII数字0とそれに続く1つ以上のASCII数字0から7で構成され、正、ゼロ、または負の整数を表すことができます。

4
Mahmoud Hossam

Javaで、先頭に「0」を付けてintを定義している場合、Octalで数値を定義していることを示します。

int a = 08は、Octalに数字「8」がないため、範囲外エラーを与えています。 Octalは0〜7の数字のみを提供します。

a = 07を定義すると、数値「0」と「7」が8進数の範囲内にあるため、範囲外エラーは発生しません。

2
Avijit Karmakar

先行ゼロは、値が8進数であることを意味します。 8は8進数ではなく、2進数では2以下、16進数ではGは有効です。

2
duskwuff