You’re actually mixing up two completely different concepts.

A **binary number** is just a number expressed in base-2 notation. Apart from the digits, everything else is exactly the same as in other number systems like decimal or hexadecimal. For example, negative numbers are obviously prefixed by a minus sign.

The decimal number `-1`

expressed as binary number is also just `-1`

. The hexadecimal value `FFFF FFFF FFFF FFFF`

is just a simple number, equivalent to decimal `18446744073709551615`

.

These conversions are all handled by `.parse`

and `#to_s`

methods on Crystal’s number types.

When you expect `FFFF FFFF FFFF FFFF`

to mean `-1`

, you’re actually talking about a **integer data type** representation which uses the two’s complement to encode a signed number. This is just a specific data format used to represent arbitrary values (in this case: a signed integer) as binary data.

This encoding is usually handled by Crystal internally and you don’t actually see it, but it can be explicitly used with the `IO::ByteFormat`

type.