Numeric literals

There are three types of numeric literals: plain integers, long integers, and floating point numbers.

Integer and long integer literals are described by the following lexical definitions:

longinteger:    integer ("l"|"L")
integer:        decimalinteger | octinteger | hexinteger
decimalinteger: nonzerodigit digit* | "0"
octinteger:     "0" octdigit+
hexinteger:     "0" ("x"|"X") hexdigit+

nonzerodigit:   "1"..."9"
octdigit:       "0"..."7"
hexdigit:        digit|"a"..."f"|"A"..."F"

Although both lower case `l' and upper case `L' are allowed as suffix for long integers, it is strongly recommended to always use `L', since the letter `l' looks too much like the digit `1'.

Plain integer decimal literals must be at most 231 - 1 (i.e., the largest positive integer, assuming 32-bit arithmetic). Plain octal and hexadecimal literals may be as large as 232 - 1, but values larger than 231 - 1 are converted to a negative value by subtracting 232. There is no limit for long integer literals.

Some examples of plain and long integer literals:

7     2147483647                        0177    0x80000000
3L    79228162514264337593543950336L    0377L   0x100000000L

Floating point literals are described by the following lexical definitions:

floatnumber:    pointfloat | exponentfloat
pointfloat:     [intpart] fraction | intpart "."
exponentfloat:  (intpart | pointfloat) exponent
intpart:        digit+
fraction:       "." digit+
exponent:       ("e"|"E") ["+"|"-"] digit+

The allowed range of floating point literals is implementation-dependent.

Some examples of floating point literals:

3.14    10.    .001    1e100    3.14e-10

Note that numeric literals do not include a sign; a phrase like -1 is actually an expression composed of the operator - and the literal 1.