Sign-magnitude representation
There are several alternative conventions used to represent negative as well as positive integers, all of which involve treating the most significant (leftmost) bit in the word as a sign bit. If the sign bit is 0, the number is positive: if the sign bit is 1, the number is negative.
The simplest form of representation that employs a sign bit is the sign-magnitude representation. In an n-bit word, the rightmost n - 1 bits hold the magnitude of the integer.
In general, if an n-bit sequence of binary digits
an−1an−2...a1a0an−1an−2...a1a0 size 12{a rSub { size 8{n - 1} } a rSub { size 8{n - 2} } "." "." "." a rSub { size 8{1} } a rSub { size 8{0} } } {} represented A, its value is
A=∑i=0n−2ai2iA=∑i=0n−2ai2i size 12{A= Sum cSub { size 8{i=0} } cSup { size 8{n - 2} } {a rSub { size 8{i} } 2 rSup { size 8{i} } } } {} If
an−1=0an−1=0 size 12{a rSub { size 8{n - 1} } =0} {}
A=−∑i=0n−2ai2iA=−∑i=0n−2ai2i size 12{A= - Sum cSub { size 8{i=0} } cSup { size 8{n - 2} } {a rSub { size 8{i} } 2 rSup { size 8{i} } } } {} If
an−1=1an−1=1 size 12{a rSub { size 8{n - 1} } =1} {}
For example: +18= 0 0010010
- 18=1 0010010
There are several drawbacks to sign-magnitude representation. One is that addition and subtraction require a consideration of both the signs of the numbers and their relative magnitudes to carry out the required operation. Another drawback is that there are two representations of 0 (e.g 0000 0000 and 1000 00000).
This is inconvenient, because it is slightly more difficult to test for 0 (an operation performed frequently on computers) than if there were a single representation.
Because of these drawbacks, sign-magnitude representation is rarely used in implementing the integer portion of the ALU. Instead, the most common scheme is twos complement representation.
Twos Complement Representation
The ones complement of a number is represented by flipping the number's bits one at a time. For example, the value 01001001 becomes 10110110.
Suppose you are working with B-bit numbers. Then the ones complement for the number N is
2B2B size 12{2 rSup { size 8{B} } } {}-1 -N
The twos complement of a number N in a B-bit system is
2B2B size 12{2 rSup { size 8{B} } } {}-N.
There is a simple way to calculate a twos complement value: invert the number's bits and then add 1.
For a concrete example, consider the value 17 which is 00010001 in binary. Inverting gives 11101110. Adding one makes this 11101111.
- Twos Complement Representation
Like sign magnitude, twos complement representation uses the most significant bit as a sign bit, making it easy to test whether an integer is positive or negative. It differs from the use of the sign-magnitude representation in the way that the other bits are interpreted.
Consider an n-bit integer. A, in twos complement representation. If A is positive, then the sign bit an-1 is zero. The remaining, bits represent the magnitude of the number in the same fashion as for sign magnitude:
A=∑i=0n−2ai2iA=∑i=0n−2ai2i size 12{A= Sum cSub { size 8{i=0} } cSup { size 8{n - 2} } {a rSub { size 8{i} } 2 rSup { size 8{i} } } } {} If
an−1=0an−1=0 size 12{a rSub { size 8{n - 1} } =0} {}
The number zero is identified as positive and therefore has a 0 sign bit and a magnitude of all 0s. We can see that the range of positive integers that may he represented is from 0 (all of the magnitude bits are 0) through - 1 (all of the magnitude bits are 1). Any larger number would require more bits.
For a negative number A (A < 0), the sign bit, is one. The remaining n-1 bits can take on any one of
an−12n−1an−12n−1 size 12{a rSub { size 8{n - 1} } 2 rSup { size 8{n - 1} } } {} values. Therefore, the range of negative integers that can be represented is from -1 to -
2n−12n−1 size 12{2 rSup { size 8{n - 1} } } {}
This is the convention used in twos complement representation, yielding the following expression for negative and positive numbers:
A
=
−
2
n
−
1
a
n
−
1
+
∑
i
=
0
n
−
2
a
i
2
i
A
=
−
2
n
−
1
a
n
−
1
+
∑
i
=
0
n
−
2
a
i
2
i
size 12{A= - 2 rSup { size 8{n - 1} } a rSub { size 8{n - 1} } + Sum cSub { size 8{i=0} } cSup { size 8{n - 2} } {a rSub { size 8{i} } 2 rSup { size 8{i} } } } {}
The range of A is from -
2n−12n−1 size 12{2 rSup { size 8{n - 1} } } {} to
2n−12n−1 size 12{2 rSup { size 8{n - 1} } } {} -1.
Example: Using 8 bit to represent
+50= 0011 0010
-70=1011 1010