# Expressions And Operators: Arithmetic

Hack provides the standard arithmetic operators. These only operate on numeric types: `int` or `float`.

The operator `+` produces the sum of its operands.

If both operands have type `int`, the result is `int`. Otherwise, the operands are converted to `float` and the result is `float`.

``````-10 + 100;       // int with value 90
100 + -3.4e2;    // float with value -240
9.5 + 23.444;    // float with value 32.944
``````

## Subtraction

The operator `-` produces the difference of its operands.

If both operands have type `int`, the result is `int`. Otherwise, the operands are converted to `float` and the result is `float`.

``````-10 - 100;       // int with value -110
100 - -3.4e2;    // float with value 440
9.5 - 23.444;    // float with value -13.944
``````

## Multiplication

The operator `*` produces the product of its operands.

If both operands have type `int`, the result is `int`. Otherwise, the operands are converted to `float` and the result is `float`.

``````-10 * 100;        // int result with value -1000
100 * -3.4e10;    // float result with value -3400000000000.0
``````

## Division

The operator `/` produces the quotient from dividing the left-hand operand by the right-hand one. Dividing by `0` will produce an exception.

If both operands have type `int`, and the result can be represented exactly as an `int`, then the result is an `int`. Otherwise, the result is `float`.

``````300 / 100;       // int result with value 3
100 / 123;       // float result with value 0.8130081300813
12.34 / 2.3;     // float result with value 5.3652173913043
``````

## Modulo

The operator `%` produces the `int` remainder from dividing the left-hand `int` operand by the right-hand `int` operand. If the right hand side is 0, an exception is thrown.

``````5 % 2;     // int result with value 1
``````

## Exponent

The operator `**` produces the result of raising the value of its left-hand operand to the power of the right-hand one.

If both operands have non-negative integer values and the result can be represented as an `int`, the result has type `int`; otherwise, the result has type `float`.

``````2 ** 3;        // int with value 8
2 ** 3.0;      // float with value 8.0
2.0 ** 3.0;    // float with value 8.0
``````

## Unary Plus

The unary plus operator `+` requires an `int` or `float` value, but has no effect. It exists for symmetry.

The following are equivalent:

``````\$v = +10;
\$v = 10;
``````

## Unary Minus

The unary minus operator `-` requires an `int` or `float` value, and returns the negated value.

``````\$v = 10;
\$x = -\$v; // \$x has value -10
``````

Note that due to underflow, negating the smallest negative value produces the same value.