eolas/neuron/94ceb35e-3c61-4d4c-8a6c-d915cb15a2b0/Twos_complement.md

100 lines
2.9 KiB
Markdown
Raw Normal View History

2024-10-19 11:00:03 +01:00
---
id: gktb
tags:
- binary
created: Tuesday, March 19, 2024
---
# Two's complement
## Summary
- _Two's complement_ is a method for representing signed numbers (negative
integers) in binary.
- It is derived by inverting the values of an unsigned binary integer to create
its signed equivalent.
- A benefit is that hardware implementation of the binary arithmetic of signed
and unsigned numbers can be handled in the same manner as unsigned numbers,
requiring no additional handling. A drawback is that it halves the
informational capacity of the given word length for the binary system.
## Detail
### Procedural steps
Two's complement divides the available word length (see
[[Binary_encoding|binary encoding]]) into two subsets: one for negative integrs
and one for positive integers.
Take the binary encoding of decimal five (`0101`). Its complement is `1011`.
The procedure for deriving the complement is as follows.
To derive the complement of an unsigned number:
1. Take the unsigned number and invert its digits: `0` becomes `1`, `1` becomes
`0`
2. Add one
2024-10-20 19:50:20 +01:00
![](static/unsigned-to-signed.png)
2024-10-19 11:00:03 +01:00
To derive the unsigned equivalent of a signed number you invert the process but
still make the smallest digit `1`:
2024-10-20 19:50:20 +01:00
![](static/signed-to-unsigned.png)
2024-10-19 11:00:03 +01:00
### Formal expression
$$
2^n - x
$$
- where $x$ is the negative integer in binary that we wish to derive
- where $n$ is the word length of the binary system in bits.
Applied to the earlier example we have $2^4 -5$ which is:
$$
16 - 5 = 11
$$
When we convert the decimal `11` to binary we get `1011` which is identical to
the signed version of the unsigned integer.
We can confirm the correctness of the derviation by summing the signed and
unsigned binary values. If this results in zeros (ignoring the overflow bit),
the derivation is correct as the two values effectively cancel each other out:
$$
1011 + 0101 = 0000
$$
### Advantages
- The circuit implementation of arithmetic involving positive and negative
integers is the same as the implementation of positive integers. There is no
need for additional harware or special handling of the values.
- This can be contrasted with the alternative approaches to signing numbers such
as **signed magnitude representation** which uses certain bits as designators
of negative/positive status.
### Limitations
- Two's complement reduces the overall informational capacity of the given
binary word length, effectively halving the total number of unique values.
- In a 4-bit system instead of 16 total unique encodings of integers you have 8
encodings for positive integers and 8 encodings for the their signed
equivalent. For integers larger than denary 8 you would need to increase the
bit length of the system
- Consequently two's complement can necessitate larger overall word lengths.
## Related notes
[[Signed_and_unsigned_numbers|signed_and_unsigned_numbers]],
[[Binary_addition|binary addition]], [[Signed_magnitude_representation]]