# Primitives - Numeric data typesS2C Home « Primitives - Numeric data types

In this lesson we take a much closer look at the numeric primitive variable data types available in Java.

The following table gives information on the numeric primitive variable data types.

Primitive Type
Type Meaning Bit Width Range
signed numeric integers
byte8-bit integer8`-128`  to  `127`
shortShort integer16`-32,768`  to  `32,767`
intInteger32`-2,147,483,648`  to  `2,147,483,647`
longLong integer64`-9,233,372,036,854,775,808`  to  `9,233,372,036,854,775,807`
signed floating point
floatSingle-precision float32`≈ ±3.40282347E+38F (6-7 significant decimal digits)`
doubleDouble-precision float64`≈ ±1.79769313486231570E+308 (15 significant decimal digits)`

### Signed Numeric Integer Types Top

Java has 4 numeric integer types `byte`, `short`, `int` and `long`.

Integer Types
Type Meaning Bit Width Range
byte8-bit integer8`-128`  to  `127`
shortShort integer16`-32,768`  to  `32,767`
intInteger32`-2,147,483,648`  to  `2,147,483,647`
longLong integer64`-9,233,372,036,854,775,808`  to  `9,233,372,036,854,775,807`

As you can see you have a choice of four different sized containers to store your integer values in. So using the correct integer type for your needs saves some bytes. You can assign one primitive integer type to another as long as the assignment is to a larger container. If you try to assign a larger integer type to a smaller the compiler throws an error and won't allow it. You can create the following class in your IDE and cut and paste the code into it.

``````
package com.server2client;
/*
Initialising and using numeric integer primitives
*/
public class IntTypes {

public static void main (String[] args) {
byte aByte = 128;
System.out.println("aByte = " + aByte);
short aShort = 642;
System.out.println("aShort = " + aShort);
int anInt = 12;
System.out.println("anInt = " + anInt);
long aLong = 3672543567;
System.out.println("aLong = " + aLong);
aShort = anInt;
System.out.println("aShort = " + aShort);
aLong = aByte;
System.out.println("aLong = " + aLong);
}
}

``````

Running the `IntTypes` class produces the following output:

Ok the compile has failed with an error as shown in the screenshot and we get our first look at a compiler error. The reason for this is that when we pass a literal value to a long we need to append `l` or `L` to it or the compiler inteprets it as an integer. Because an integer has a range of `-2,147,483,648`  to  `2,147,483,647` the number is out of range even though we passed it to a `long` primitive type. We looked at literals in the Java Variables - Java Literals lesson; lets correct our code and append an `L` to it. I suggest always using an uppercase `L` when specifying a long literal as a lowercase `l` looks a lot like the number `1`. So edit your code and add the `L` to the end of the number so you now have `3672543567L`.

Rerunning the `IntTypes` class produces the following output:

Ok the compile has failed again with two more errors as shown in the screenshot above. The first error is because we have given the variable `aByte` a value of 128. The `byte` type range is `-128`  to  `127` so this is out of range. Change this to 127 to fix this error. The second error happens because we are trying to put an `int` into a `short`. Even though the value contained in the variable `anInt` of `12` easily fits into the range of a short `-32,768`  to  `32,767` the compiler just sees an `int` trying to be squeezed into a `short` and won't allow it. So let's change this to `aByte` from `anInt` as follows `aShort = aByte;`.

Rerunning the `IntTypes` class produces the following output:

Well we got there in the end and as you can see the Java compiler isn't always as intuitive as we would like. Sometimes the compiler points to the wrong line or points to a place above or below the error. With practice you get used to compiler errors and you will get plenty of that as you write your Java code :).

#### Numeric Integer Test

Try this to test your knowledge of numeric integer types. Read down the list and check those you think will compile. Treat the list as a sequence of statements.

Statement Compiles?
int i; yes noThis will compile.
byte b = -12; yes noThis will compile.
short s = 123.45; yes noWill not compile (cannot put a double in short).
long l = 12; yes noThis will compile (treated as an int and in range).
i = l; yes noWill not compile (cannot put an int into a long).
b = -130; yes noWill not compile (out of range).
l = b; yes noThis will compile.
l = 12L; yes noThis will compile.

### Signed Floating-Point Types Top

Java has 2 floating-point types `float` and `double`.

Integer Types
Type Meaning Bit Width Range
floatSingle-precision float32`≈ ±3.40282347E+38F (6-7 significant decimal digits)`
doubleDouble-precision float64`≈ ±1.79769313486231570E+308 (15 significant decimal digits)`

Floating-point types represent non-integer numbers that have a fractional component and come in two flavours as described in the table above. Floating-point types default to the `double` type unless we append an `f` or `F` when we initialize them. When this happens the compiler fails as it thinks we passed a `double` to a `float` primitive.

You can create the following class in your IDE and cut and paste the code into it.

``````
package com.server2client;
/*
Initialising and using numeric floating-point primitives
*/
public class FloatTypes {

public static void main (String[] args) {
float aFloat = 12.34F;
System.out.println("aFloat = " + aFloat);
double aDouble = 642.2761;

// Dynamically initialized runtime by other variables
double bDouble = aFloat * aDouble;
System.out.println("bDouble = " + bDouble);
}
}

``````

Below is the screenshot of running this code. Notice that the floating point doesn't display the `F` its just our way of telling the compiler this is a `float` primitive. The other interesting point is variable `bDouble` which is dynamically initialized at runtime from the other two variables

### Related Quiz

Fundamentals Quiz 4 - Primitives - Numeric data types Quiz

## Lesson 5 Complete

In this lesson we looked at the numeric primitive variable data types available in Java.

## What's Next?

In the next lesson we look at method scope and what scope and its definition mean.