akios @ ウィキ
3.10.1. 整数リテラル
最終更新:
akios
-
view
3. 字句構造
3.1. Unicode
3.2. 字句変換
3.3. Unicodeエスケープ
3.4. 行終端子
3.5. 入力要素とトークン
3.6. 空白
3.7. コメント
3.8. 識別子
3.9. キーワード
3.10. リテラル
3.10.1. 整数リテラル
整数リテラル(integer literal)は10進、16進、8進、2進のいずれかで表記することができます。
IntegerLiteral:
DecimalIntegerLiteral
HexIntegerLiteral
OctalIntegerLiteral
BinaryIntegerLiteral
DecimalIntegerLiteral
HexIntegerLiteral
OctalIntegerLiteral
BinaryIntegerLiteral
DecimalIntegerLiteral:
DecimalNumeral IntegerTypeSuffixopt
DecimalNumeral IntegerTypeSuffixopt
HexIntegerLiteral:
HexNumeral IntegerTypeSuffixopt
HexNumeral IntegerTypeSuffixopt
OctalIntegerLiteral:
OctalNumeral IntegerTypeSuffixopt
OctalNumeral IntegerTypeSuffixopt
BinaryIntegerLiteral:
BinaryNumeral IntegerTypeSuffixopt
BinaryNumeral IntegerTypeSuffixopt
IntegerTypeSuffix: one of
l L
l L
末尾にASCII文字でlもしくはLが付いていればその整数リテラルはlong型です。それ以外ならそれはint型です(4.2.1.)。
末尾文字はLが推奨されます。文字lは数字の1と見間違いやすいからです。
整数の桁を区切るのにアンダースコアを使用できます。
16進数や2進数のリテラルの場合、整数は文字0xや0bの直後から型接尾語の前までにしか書くことができません。このため、アンダースコアは0xや0bの直後や最後の桁の直後には使用できません。
10進数や8進数のリテラルの場合、整数は型接尾語の前にまでにしか書くことが出来ません。このため、アンダースコアは最初の桁より前や最後の桁の直後には使用できません。8進数の場合、最初の0(整数の一部とみなせる)の直後からアンダースコアを使用することはできます。ゼロ以外の10進数リテラルの場合、最初のゼロ以外の数字の後にアンダースコアを使用することができます。
10進数は整数のゼロを表す単一のASCII文字0か、正の整数を表すASCII文字1~9に0個以上のASCII文字0~9(アンダースコアを含む)が続く表記のいずれかです。
DecimalNumeral:
0
NonZeroDigit Digitsopt
NonZeroDigit Underscores Digits
0
NonZeroDigit Digitsopt
NonZeroDigit Underscores Digits
Digits:
Digit
Digit DigitsAndUnderscoresopt Digit
Digit
Digit DigitsAndUnderscoresopt Digit
Digit:
0
NonZeroDigit
0
NonZeroDigit
NonZeroDigit: one of
1 2 3 4 5 6 7 8 9
1 2 3 4 5 6 7 8 9
DigitsAndUnderscores:
DigitOrUnderscore
DigitsAndUnderscores DigitOrUnderscore
DigitOrUnderscore
DigitsAndUnderscores DigitOrUnderscore
DigitOrUnderscore:
Digit
_
Digit
_
Underscores:
_
Underscores _
_
Underscores _
16進数は先頭にASCII文字0xもしくは0Xがあり続く1つ以上のASCII文字16進数(アンダースコアを含む)で表され、正、ゼロ、負のいずれかの整数を表します。
16進数の10から15の値はASCII文字のAからFもしくはaからfによってそれぞれ表します。大文字小文字問いません。
HexNumeral:
0 x HexDigits
0 X HexDigits
0 x HexDigits
0 X HexDigits
HexDigits:
HexDigit
HexDigit HexDigitsAndUnderscoresopt HexDigit
HexDigit
HexDigit HexDigitsAndUnderscoresopt HexDigit
HexDigit: one of
0 1 2 3 4 5 6 7 8 9 a b c d e f A B C D E F
0 1 2 3 4 5 6 7 8 9 a b c d e f A B C D E F
HexDigitsAndUnderscores:
HexDigitOrUnderscore
HexDigitsAndUnderscores HexDigitOrUnderscore
HexDigitOrUnderscore
HexDigitsAndUnderscores HexDigitOrUnderscore
HexDigitOrUnderscore:
HexDigit
_
HexDigit
_
上記のHexDigitの生成規則は3.3.からきています。
8進数は先頭にASCII数字0があり続く1つ以上のASCII数字0から7(アンダースコアを含む)で表され、正、ゼロ、負のいずれかの整数を表します。
OctalNumeral:
0 OctalDigits
0 Underscores OctalDigits
0 OctalDigits
0 Underscores OctalDigits
OctalDigits:
OctalDigit
OctalDigit OctalDigitsAndUnderscoresopt OctalDigit
OctalDigit
OctalDigit OctalDigitsAndUnderscoresopt OctalDigit
OctalDigit: one of
0 1 2 3 4 5 6 7
0 1 2 3 4 5 6 7
OctalDigitsAndUnderscores:
OctalDigitOrUnderscore
OctalDigitsAndUnderscores OctalDigitOrUnderscore
OctalDigitOrUnderscore
OctalDigitsAndUnderscores OctalDigitOrUnderscore
OctalDigitOrUnderscore:
OctalDigit
_
OctalDigit
_
8進数は常に2桁以上の数字で構成されます。0は常に10進数とみなされすが、数値0、00、0x0は全て全く同じ整数値を表しているため、実質上問題になりません。
2進数は先頭にASCII文字0bもしくは0Bがあり続く1つ以上のASCII数字0もしくは1(アンダースコアを含む)で表され、正、ゼロ、負のいずれかの整数を表します。
BinaryNumeral:
0 b BinaryDigits
0 B BinaryDigits
0 b BinaryDigits
0 B BinaryDigits
BinaryDigits:
BinaryDigit
BinaryDigit BinaryDigitsAndUnderscoresopt BinaryDigit
BinaryDigit
BinaryDigit BinaryDigitsAndUnderscoresopt BinaryDigit
BinaryDigit: one of
0 1
0 1
BinaryDigitsAndUnderscores:
BinaryDigitOrUnderscore
BinaryDigitsAndUnderscores BinaryDigitOrUnderscore
BinaryDigitOrUnderscore
BinaryDigitsAndUnderscores BinaryDigitOrUnderscore
BinaryDigitOrUnderscore:
BinaryDigit
_
BinaryDigit
_
int型の10進リテラルの最大値は2147483648(231)です。
int型リテラルを記述できる場所ならどこでも0から2147483647までの10進リテラルを書くことができます。
2147483648(231)を超えるint型の10進リテラルや単項マイナス演算子オペランド以外での2147483648はコンパイルエラーとなります。
int型正の最大値である10進数で2147483647(231-1)を16進、8進、2進リテラルで表すと、それぞれ以下の通りです。:
- 0x7fff_ffff
- 0177_7777_7777
- 0b0111_1111_1111_1111_1111_1111_1111_1111
int型負の最大値である10進数で-2147483648(231)を16進、8進、2進リテラルで表すと、それぞれ以下の通りです。:
- 0x8000_0000
- 0200_0000_0000
- 0b1000_0000_0000_0000_0000_0000_0000_0000
10進数-1を16進、8進、2進リテラルで表すと、それぞれ以下の通りです。:
- 0xffff_ffff
- 0377_7777_7777
- 0b1111_1111_1111_1111_1111_1111_1111_1111
int型リテラルで32ビットを超える16進、8進、2進リテラルはコンパイルエラーとなります。
long型の10進リテラルの最大値は9223372036854775808L(263)です。
long型リテラルを記述できる場所ならどこでも0Lから9223372036854775807Lまでの10進リテラルを書くことができます。
9223372036854775808L(263)を超えるlong型の10進リテラルや単項マイナス演算子オペランド以外での9223372036854775808Lはコンパイルエラーとなります。
long型正の最大値である10進数で9223372036854775807L(263-1)を16進、8進、2進リテラルで表すと、それぞれ以下の通りです。:
- 0x7fff_ffff_ffff_ffffL
- 07_7777_7777_7777_7777_7777L
- 0b0111_1111_1111_1111_1111_1111_1111_1111_1111_1111_1111_1111_1111_1111_1111_1111L
long型負の最大値である10進数で-9223372036854775808L(263)を16進、8進、2進リテラルで表すと、それぞれ以下の通りです。:
- 0x8000_0000_0000_0000L
- 010_0000_0000_0000_0000_0000L
- 0b1000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000L
10進数-1Lを16進、8進、2進リテラルで表すと、それぞれ以下の通りです。:
- 0xffff_ffff_ffff_ffffL
- •017_7777_7777_7777_7777_7777L
- 0b1111_1111_1111_1111_1111_1111_1111_1111_1111_1111_1111_1111_1111_1111_1111_1111L
long型リテラルで64ビットを超える16進、8進、2進リテラルはコンパイルエラーとなります。
int型リテラルの例:
0 2 0372 0xDada_Cafe 1996 0x00_FF__00_FF
long型リテラルの例:
0l 0777L 0x100000000L 2_147_483_648L 0xC0B0L