# Java: Integers

Integers are whole numbers, for example, -35, 0, 2048, .... Integers are represented in binary inside the computer, and in decimal in Java source programs. Java automatically converts decimal numbers you write in your source program into binary numbers internally.

## Four (or five) kinds of primtive integers and two integer classes.

Primitive types. The are four types of integers in Java: `byte`, `short`, `int`, `long`. The most common is `int`. All integers are stored in signed, two's-complement, format.

char! Technically, `char` is an unsigned integer type altho it is almost exclusively used to store characters. Making it integer is largely because of Java's legacy from C++. Don't use `char` for integers unless you are sure of what you're doing.

Classes. In addition to the primitive types, there are two classes used for integers.

- Integer - Primarily useful for utility methods and to put in the Collections data structure classes.
- BigInteger - Used where unbounded arithmetic is important.

## How Java stores integers in memory

Java stores all integers in memory as binary numbers.

type | Size | Range
name | bytes | bits | minimum | maximum
`byte` | 1 | 8 | -128 | +127
`short` | 2 | 16 | -32,768 | +32,767
`int` | 4 | 32 | -2,147,483,648 | +2,147,483,647
`long` | 8 | 64 | -9,223,372,036,854,775,808 | +9,223,372,036,854,775,807

## How to write integer literals

Here is how to write decimal integer literals (constants).

- `int` literals are written in the usual decimal notation, like 34 or -222.
- `long` literals are written by adding an L (or lowercase l altho this is almost impossible to distinguish from the digit 1), eg, 34L or -222L.
- There is no way to write a literal `byte` or `short`, altho sometimes Java will automatically cast an int literal to the appropriate type.

## Hexadecimal literals

You can write an int in hexadecimal by prefixing the hexadecimal number with the digit zero followed by the letter x, "0x" or "0X". The hexadecimal digits are 0-9 and the letters a-f in upper- or lowercase.

       int i;
       i = 0x2A;  // assigns decimal 42 to i.

## The shame of integer arithmetic

Operations may produce numbers which are too large (overflow) to be stored in an `int`. No error is caused in this case; the result is simply an incorrect number (one of the shames of modern computer arithmetic). Division by zero will cause an execution exception (ArithmeticException). Use BigInteger to prevent arithmetic overflow.

## Webliography

- Algorithms: Getting a Number's Ordinal