# Expressions
## Number Formats
### Binary
Binary numbers in AZ65 use standard 6502 binary number syntax. They are prefixed
with a modulus (`%`). For example:
* `%00001111`
* `%1010`
* `%0`
### Hexadecimal
Like binary numbers, standard syntax is used. They are prefixed with a
dollar-sign (`$`) and are **case-insensitive**. For example:
* `$1234`
* `$DADcafe`
* `$0`
### Decimal
Numbers without a `%` or `$` prefix are assumed to be decimal (base 10) numbers.
## Operators
All expressions in AZ65 operate on 32-bit **signed** integers with wrapping
over/underflow semantics. All operators and their precedence match that of the C
language with a few notable modifications:
1. There is no C binary comma (`,`) operator. It is mostly an anachronism that
many C programmers aren't even aware exists.
2. The unary `<` and `>` operators, common in 6502 assembly, are present. They
are used to get the low and high byte of a 16-bit word. For example:
* `< $1234` evaluates to `$34`.
* `> $1234` evaluates to `$12`.
3. There is a unary `+` operator. This is mainly used to disambiguate between
expressions and memory locations in some assembly languages. For example,
in z80 assembly the instruction `ld a, ($42)` is ambiguous. A programmer
may intend for this to load the value `$42` into `a`, but AZ65 will interpret
this is loading a byte at address `$0042` into `a`. To add clarity, you can
use a unary `+` to indicate that you are passing a numeric expression rather
than an address:
* `ld a, +($42)`
4. Unsigned (logical) shift operators are provided. Use the `<<<` and `>>>`
symbols to shift left and right respectively:
* `$ffffffff >>> 1` evaluates to `$7fffffff`
* `$ffffffff <<< 1` evaluates to `$fffffffe`