2024-03-19 07:20:03 +00:00
|
|
|
---
|
|
|
|
id: gktb
|
|
|
|
title: Two's complement
|
2024-03-20 07:50:03 +00:00
|
|
|
tags: [binary, binary-encoding]
|
2024-03-19 07:20:03 +00:00
|
|
|
created: Tuesday, March 19, 2024
|
|
|
|
---
|
|
|
|
|
|
|
|
# Two's complement
|
|
|
|
|
|
|
|
## Summary
|
|
|
|
|
|
|
|
- _Two's complement_ is a method for representing signed numbers (negative
|
|
|
|
integers) in binary.
|
|
|
|
|
2024-03-20 07:50:03 +00:00
|
|
|
- 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.
|
2024-03-19 07:30:04 +00:00
|
|
|
|
2024-03-19 07:20:03 +00:00
|
|
|
## Detail
|
|
|
|
|
2024-03-19 07:30:04 +00:00
|
|
|
### 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-03-20 07:20:03 +00:00
|
|
|
To derive the unsigned equivalent of a signed number you invert the process but
|
|
|
|
still make the smallest digit `1`:
|
|
|
|
|
|
|
|

|
2024-03-19 07:30:04 +00:00
|
|
|
|
|
|
|
### Formal expression
|
|
|
|
|
2024-03-20 07:20:03 +00:00
|
|
|
$$
|
|
|
|
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
|
|
|
|
$$
|
|
|
|
|
2024-03-20 07:30:03 +00:00
|
|
|
### 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
|
2024-03-20 07:40:03 +00:00
|
|
|
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
|
2024-03-20 07:50:03 +00:00
|
|
|
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.
|
2024-03-19 07:20:03 +00:00
|
|
|
|
|
|
|
## Related notes
|
|
|
|
|
|
|
|
[[Signed_and_unsigned_numbers|signed_and_unsigned_numbers]]
|
2024-03-20 07:50:03 +00:00
|
|
|
[[Binary_addition|binary addition]]
|