In the previous article, we saw how to represent positive integers (which was quite easy). Now we are going to see how to represent negative integers, which has a bit “more to it”.
In binary, we normally represent binary numbers in two’s complement. It is a technique that simplifies calculations when working with negative numbers (although it is somewhat more complicated for humans to understand).
But instead of simply explaining what two’s complement is, let’s try to reason why we use this system and how we arrived at this representation.
A “heavy” explanation of how the two’s complement system came about
If you are not interested and just want to see how it works, jump to the next section
Representing negative numbers in binary
Let’s assume we are “inventing” how to represent negative numbers in binary. We will see the logical steps that would lead us to arrive at two’s complement.
Attempt A: One bit for the sign
The first thing that comes to mind is, “let’s use the leftmost bit to indicate that a number is negative”.
We leave the rest the same. The other bits will be the same for positive and negative. So, in 4 bits, -3 to 3 would look like this.
Sign | Bit1 | Bit2 | Bit3 | Decimal |
---|---|---|---|---|
0 | 0 | 1 | 1 | 3 |
0 | 0 | 1 | 0 | 2 |
0 | 0 | 0 | 1 | 1 |
0 | 0 | 0 | 0 | 0 |
1 | 0 | 0 | 0 | -1 |
1 | 0 | 0 | 1 | -2 |
1 | 0 | 1 | 0 | -3 |
Okay, very easy to understand. But if we add -3 and 3… we get -6.
Sign | Bit1 | Bit2 | Bit3 | Decimal | |
---|---|---|---|---|---|
0 | 0 | 1 | 1 | 3 | |
+ | 1 | 0 | 1 | 0 | -3 |
= | 1 | 1 | 0 | 1 | -6 |
With this first attempt, we have done something that is quite understandable for humans, but it complicates calculations a lot. So let’s rethink it.
Attempt B: One’s Complement
The bit for the sign has worked well. Also, we have no other choice. For the rest, let’s try something, let’s invert the bits of negative numbers.
Thus, the numbers from -3 to 3 would look like this.
Sign | Bit1 | Bit2 | Bit3 | Decimal |
---|---|---|---|---|
0 | 0 | 1 | 1 | 3 |
0 | 0 | 1 | 0 | 2 |
0 | 0 | 0 | 1 | 1 |
0 | 0 | 0 | 0 | 0 |
1 | 1 | 1 | 1 | -0 |
1 | 1 | 1 | 0 | -1 |
1 | 1 | 0 | 1 | -2 |
1 | 1 | 0 | 0 | -3 |
Now, if we add them, this is the result.
Sign | Bit1 | Bit2 | Bit3 | Decimal | |
---|---|---|---|---|---|
0 | 0 | 1 | 1 | 3 | |
+ | 1 | 1 | 0 | 0 | -3 |
= | 1 | 1 | 1 | 1 | -0 |
Okay, we have improved… inverting the numbers has been a good “trick” because bit by bit the positive and negative cancel each other out, resulting in all 1’s, which we have said is a 0.
But dude Now we have 2 distinct zeros! We have +0 and -0. Moreover, the sum results in -0, not 0.
That is a bit strange. In the long run, it will surely cause us problems. So let’s rethink it to see if we can fix it.
Bingo!: Two’s Complement
We have finally arrived at the definitive solution. We do the same
- Bit for the sign
- Negative numbers negated
- Additionally, we add ‘1’ to the negatives
Thus, the numbers from -3 to 3 would look like this.
Sign | Bit1 | Bit2 | Bit3 | Decimal |
---|---|---|---|---|
0 | 0 | 1 | 1 | 3 |
0 | 0 | 1 | 0 | 2 |
0 | 0 | 0 | 1 | 1 |
0 | 0 | 0 | 0 | 0 |
1 | 1 | 1 | 1 | -1 |
1 | 1 | 1 | 0 | -2 |
1 | 1 | 0 | 1 | -3 |
Now we add -3 and 3 and…
Sign | Bit1 | Bit2 | Bit3 | Decimal | |
---|---|---|---|---|---|
0 | 0 | 1 | 1 | 3 | |
+ | 1 | 1 | 0 | 1 | -3 |
= | 0 | 0 | 0 | 0 | 0 |
Bingo! It gives 0. Not -0 or some strange thing. It gives zero, just one zero.
Just like before, by inverting the negative numbers, we caused a situation where adding a negative and a positive “couples” to give a sequence of all 1’s.
But, in addition, since now we add an extra 1 (which carries the negative number), all those 1’s overflow and turn into zero. And that’s why we use two’s complement.
Finally, and if you were wondering, the two’s complement of the two’s complement of a number is the number itself. That is, -(-3) = 3. Well, that’s appreciated, but it also happened with the other examples.
Your friend two’s complement
In summary of everything we have seen, two’s complement is a way of representing negative numbers in binary system.
At first glance, it seems complicated, but it is widely used because it allows us to operate with negative numbers easily (it greatly simplifies calculations).
If we want to convert a positive number to negative in binary representation in two’s complement:
- Set the left bit, which represents the sign, to
1
- Invert the rest of the bits
- Add 1 to the previous result
How much is a binary number worth?
I return to this, because it’s something that confuses a lot of people. How much is a binary number worth? Let’s imagine you have this number:
10011001
How much is this number worth?
- Some of you will tell me 153
- Others will tell me -103
How can that be? Because a binary number represents nothing unless you tell me what system it uses to represent it.
The binary representation is the same. But the number they represent is NOT the same.
To know what number it is, I need you to say what you are representing, an integer, an integer with negatives, if it is a float.