Subtraction and addition are intertwined, so pure subtractors are not common.
How can we perform subtraction with an adder?
Negate the subtrahend... add (12 -7 = 12 + (-7)) |
Look at ways to represent signed binary numbers:
Signed magnitude - most significant bit used for "minus sign" | |
2's complement | |
1's complement |
Most significant bit is set to 1 for negative numbers:
5 is 00101 | |
and -5 is 10101 |
2 cases when subtracting:
Positive result | Negative result |
1101 | 0110 |
-0110 | - 1101 |
------- | ------- |
0111 | 1001 |
-10000 | |
======= | |
-0111 |
No carry from the most significant bit... means positive result and we're done | |
Most significant carry... means that the result is negative, subtract 2n |
There might be an easier way
In general: R's complement to a radix R number is:
The most significant bit equals -(2n) | |
Remaining bits normal binary value |
Examples:
Example
1:
01001 = 8 + 1 = 9 |
Example
2:
10110 = -16 + 4 + 2 = -10 |
With 2's complement the negative of a number is the bit-wise complement plus one:
Example:
00110 = 6
What is -6? Bit-wise complement + 1 11001 + 1 = 11010 11010 = -16 + 8 + 2 = -6 |
Now, let's subtract using 2's complement representation:
Example: 2's complement, positive result
45 - 19 ======== 26
101101 - 010011 ========
2's comp -->
0101101 + 1101101 ======== 0011010 Check: 0011010 = 16+8+2 = 26... ok
Example: 2's complement, negative result
19 - 45 ======== -26
010011 - 101101 ========
2's comp -->
0010011 + 1010011 ======== 1100110 Check: 1100110 = -64+32+4+2 = -26... ok General algorithm when subtracting with 2's complement:
If carry into the most significant, then results is positive and you're done | |
If no carry, then result is the correct 2's complement negative answer |
Generally case is called "Radix diminished complement" for radix R numbers.
Most significant bit equals (2n -1) | |
Remaining bits have normal binary value |
Biggest change from 2's complement. Negating a number is simple: take the bit-wise complement.
Example:
00110 = 6
What is -6? Take Bit-wise complement 11001 = -15 + 8 + 1 = -6 |
Ok, subtract using 1's complement:
Example: 1's complement, positive result | |||||||||||||||||||||||
|
|
|
|
||||||||||||||||||||
Check: 0011010 = 16+8+2 = 26... ok |
Example: 1's complement, negative result | |||||||||||||||||||
|
|
|
|
||||||||||||||||
Check: 1100110 = -63+32+4+1 = -26... ok |
Algorithm:
A carry into the most significant bit is added to the result... "end-around carry" | |
No, end-around carry means you have the 1's complement negative answer |
Compare the three methods for representing negative numbers:
Signed-magnitude - requires translation to 2's complement and back again... this means extra hardware | |
1's complement - better, but the "end-around carry" is an extra step in the process | |
2's complement - best for the subtraction process |
With 1's or 2's complement adder/subtractors are the best option
2's complement is the common form used to represent negative numbers
Note: there is a table comparing the three repsentations of negative numbers from -8 to +7 on page 140 of our text.