# Java primitives conversion & operations

## First, booleans

Booleans cannot be assigned to any other types, and you can't do any arithmetic on them. So `true`

doesn't count as `1`

, nor does `1`

count as `true`

. No truthy and falsy in Java.

## Converting: `a = b`

Some types can only be converted if you cast explicitly. These are usually the cases where a type with a wider or different range is converted to one with a narrower range. If you use explicit casting, you might be changing to a nonsense value if it's outside the range of the target.

from / into |
byte | short | char | int | long | float | double |
---|---|---|---|---|---|---|---|

byte | implicit | explicit | implicit | implicit | implicit | implicit | |

short | explicit | explicit | implicit | implicit | implicit | implicit | |

char | explicit | explicit | implicit | implicit | implicit | implicit | |

int | explicit | explicit | explicit | implicit | implicit | implicit | |

long | explicit | explicit | explicit | explicit | implicit | implicit | |

float | explicit | explicit | explicit | explicit | explicit | implicit | |

double | explicit | explicit | explicit | explicit | explicit | explicit |

## Arithmetic: `a + b`

This table shows the output for arithmetic operations between two variables. For example, `long * float`

becomes a float.

byte | short | char | int | long | float | double | |
---|---|---|---|---|---|---|---|

byte | integer | integer | integer | integer | long | float | double |

short | integer | integer | integer | integer | long | float | double |

char | integer | integer | integer | integer | long | float | double |

int | integer | integer | integer | integer | long | float | double |

long | long | long | long | long | long | float | double |

float | float | float | float | float | float | float | double |

double | double | double | double | double | double | double | double |

## Integers versus decimals

Note that this does not mean that information cannot be lost! For example, `Long.MAX_VALUE = 9223372036854775807`

, but when stored as a float it is approximated as `9223372036854776000`

in a float: a big difference.

`float`

and `double`

don't have uniform spacings between adjacent representable values. Low values are much closer together than high values. The spacing between two values that can be represented exactly is much greater than 1 for high values (so `a + 1.0`

might be `a`

if it is a float or double). You might have expected this, since a `int`

has 4 bytes with range from `-2^31`

to `+2^31-1`

possible values, where `float`

also has 4 bytes but has a much bigger range (`2^(2^7) = 3.4e38`

). Obviously it cannot store all the numbers that integer can, there aren't enough bytes (and that ignores non-integer numbers).

So what this means, is that although you can store integers are decimals without explicit casting, you might still lose precision for higher integers.

## Comments

No comments yet

You need to be logged in to comment.