|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Integers: 2's complement |
|
|
|
|
2's complement (2C) may
not be intuitively obvious, but it has nice properties |
|
|
Negation |
|
|
|
|
1. flip all bits |
|
|
|
|
2. add 1 (ignoring any
carry out of the msb) |
|
|
|
Example: 11ten is 01011 in 5-bit
unsigned binary. Call this number B. |
|
|
|
1. flip bits: |
10100 |
|
~B |
|
|
|
2. add 1: |
+ 1 |
|
|
|
|
|
|
|
10101 |
|
-B |
|
|
What do we get if we add
this to the original number? |
|
|
|
|
|
01011 |
|
B |
|
|
|
|
+ |
10101 |
|
+ -B |
|
|
|
|
|
00000 |
|
0 |
|
|
If we negate B (-B)
using 2C and negate again (--B) we get the original value B back. |
|
|
|
1. flip bits: |
01010 |
|
~(-B) |
|
|
|
2. add 1: |
+ 1 |
|
|
|
|
|
|
|
01011 |
|
B |
|
|
Other ways to do N-bit 2C
negation: |
|
|
|
|
1. Find the rightmost 1
bit, then flip all the higher bits (bits to the left). |
|
|
|
Example: |
|
01011 |
|
|
|
|
|
Rightmost 1 bit is b0 |
|
|
|
|
|
flip bits to the left: |
10101 |
|
|
|
|
|
Why does this work? |
|
|
|
|
|
|
Consider N-bit value
value: B = bN-1bN-2 . . . 1 0 . . . 0 |
|
|
where bk is 1 and all bi are 0 for i < k |
|
|
If we create the
negation -B by flipping the bits to the left of bk, then |
|
|
|
-B = ~bN-1~bN-2 . . . 1 0 . .
. 0 |
|
|
|
What happens when we add
these 2 numbers? |
|
|
|
For each bi, i < k, the sum of the
bits is 0 + 0 = 0 |
|
|
|
For bit k, the sum of
the bits is 1 + 1 = 10, so the result is 0 with carry 1 |
|
|
|
Now, for i > k, each
bit is either 0 or 1 in B and the opposite in -B |
|
|
|
So, the result is 1 + 0 +
carry bit 1 for a result of 0 and a carry 1 |
|
|
|
For the leftmost bit
position N-1, the result is 0, and the final carry is ignored. |
|
|
Therefore, the result
consists of all 0's, which must be true for B + (-B) |
|
|
|
2. Subtract B from value:
1 followed by N 0's. |
|
|
|
Example: |
|
01011 |
|
|
|
|
|
subtract from 100000: |
100000 |
|
|
|
|
|
- 01011 |
|
|
|
|
|
10101 |
|
|
|
Odometer (Ferris Bueller)
view: |
|
Ferris Bueller's Day Off |
|
|
|
Consider a 4-digit
decimal odometer. |
|
|
|
What is the largest
milage it can show? |
|
|
|
9999 |
|
|
|
|
What happens if we go 1
more mile? |
|
|
|
|
0000 |
|
|
|
|
Now, think of starting at
0000 and going backward, like Ferris: |
|
|
|
Go back 1 mile, and the
odometer reads 9999, 2 miles 9998, and so forth. |
|
|
|
N-bit 2's complement is
really like a binary odometer: |
|
|
|
Go forward from 00 . . .
0 for positive numbers. |
|
|
|
Go backward for negative
numbers. |
|
|
|
What's really going on
here mathematically? |
|
|
|
What is the value of 1
followed by N 0's? 2N |
|
|
|
So, N-bit 2C is really
based on arithmetic modulo 2N |
|
|
|
This is why 2C has nice
properties for doing arithmetic. |
|
|
Advantages of 2C
representation: |
|
|
|
Only 1 zero |
|
|
|
|
|
Add using same hardware
as unsigned binary |
|
|
Subtract by taking
complement and adding. |
|
|
Why is there only 1 zero? |
|
|
|
|
Consider the 5-bit
positive zero 00000 |
|
|
|
1. flip bits: |
11111 |
|
|
|
|
2. add 1: |
+ 1 |
|
|
|
|
|
|
00000 |
|
|
|
|
This is negative 0, but
it has the same representation :) |
|
|
Range of values: |
|
|
|
|
Maximum positive number:
2N-1 - 1 |
|
|
|
Minimum negative number:
- (2N-1) |
|
|
Total number of values
(including 0): 2N |
|
|
Converting from base 10 to N-bit 2C |
|
|
1. Convert to N bits UB |
|
|
2. If number has minus sign, negate: |
|
|
flip bits |
|
|
add 1 |
|
|
Converting from N-bit 2C to base 10 |
|
|
1. If msb
is 1 (negative number), negate |
|
|
2. Convert result (or
original value) as UB to base 10 |
|
|
3. If number was negative, insert minus sign |
|
|
Conclusion: 2C rules! |
|
|
|
Most computer
representations of signed integers use 2C. |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|