Often it is necessary to be able to work with numbers which may be either negative or positive. The basic unsigned binary encoding scheme can easily be extended to permit signed values by means of a system called 2's Complement encoding. In terms of processor circuitry, the inclusion of 2's Complement requires two additional flags: the Sign flag and the Overflow flag.

The shorthand "hexadecimal" notation is a convenience for humans which reduces the difficulties and number or errors that would arise if we needed to work with internal computer patterns as long sequences of 0's and 1's.

- Some Analogies of Digital Modular Systems
**What Time Will It Be?**- Suppose that it is now 2 o'clock and that I've been working for 5 hours. At what time did I start work?
- If it is now 2 o'clock and I started 5 hours ago, to figure out my starting time I need to subtract 5 hours from 2 o'clock. We seem to be faced with two conflicting answers:
- based on our knowledge of the clock, the answer should be 9 o'clock
- based on our knowledge of basic arithmetic, the answer should be (-3) o'clock
- What would it mean to say that the time was (-3) o'clock?
- What would it mean to say that the time was 0 o'clock?
- Is 9 o'clock a reasonable way of talking about (-3) o'clock, or about 3 hours before 0 o'clock, or about 4 hours before 1 o'clock, or about 5 hours before 2 o'clock (all of which are the same thing)?
**How Far Have I driven?**- Suppose I have a (6-digit) car odometer which is set up to reduce the distance it shows if I drive backwards. Also imagine that when the car is quite new with an odometer reading of 000004, I drove it backwards for 6 kilometers and then forward for 10 kilometers.
- the final odometer reading should be 000008
- if the odometer reads 8 (000008) after driving forward 10 kilometers, then before driving forward 10 kilometers the odometer must have had a reading that was the equivalent of -2
- the actual odometer reading after driving backwards 6 kilometers from a initial reading of 4 (000004) kilometers would have been 999998
- for an odometer, 999998 must be the equivalent to -2
**2's Complement Encoding for Positive Values**- for zero and all positive values, the 2's Complement encoded form for a number is identical to the (unsigned) binary encoded version
**2's Complement Encoding for Negative Values (by Subtraction)**- for negative values, the 2's Complement form can be obtained by subtracting the absolute value of the number from 0 (and ignoring the Carry flag error indicator)
- in a system using an 8-bit word, a word could could be used to encode any value between 0 and 255 inclusive using the Unsigned Binary Method
- an attempt to encode 256 using Unsigned Binary encoding in an 8-bit word would result in the same pattern as encoding 0 (except that the Carry flag would likely be turned on indicating that the limits of Unsigned Binary had been crossed)
- 256 and 0 can therefore be viewed as equivalent values within the context of an 8-bit word
- using the 2's Complement method, -1 would be the same (share the same pattern) as 255 in Unsigned Binary; -2 would share the same pattern as 254 in Unsigned Binary; etc.
**2's Complement Encoding for Negative Values (Alternative Method)**

For an negative number:

- encode the absolute value using Unsigned Binary
- reverse the bit pattern
- add 1

**Sign Determination of a 2's Complement Encoded Value**- For decoding purposes, we need some rule to determine whether a given pattern represents a positive or a negative value
- In 2's Complement, the rule is that any word whose left-most bit is a 1 is negativel any word whose left-most bit is a 0 is either 0 or positive
- As an example, consider the two patterns 01111111 and 10000000 in an 8-bit word system. In Unsigned Binary the difference between these values is simply 1 and there is no particular significance if a count moves up by one from 01111111 to 10000000. However, in 2's Complement moving from 01111111 to 10000000 is of major significance since the count has gone from a large positive value to a negative value (with a large magnitude). The point at which the left-most bit switches therefore becomes a limit point for 2's Complement, very much like the point where the bits reset to all 0's from all 1's is a limit for Unsigned Binary encoding.

**Overflow**- Whenever the results of an arithmetic operation are such that the result should be a large positive value but appears to be a negative value because the left-most bit is on, or when the results should be a negative value but appear to be positive because the left-most bit is off, an Overflow flag is turned on.
- When performing addition or subtraction with values which are intended to be in 2's Complement encoded form, the addition or subtraction should be followed by a test of the Overflow flag to catch errors in the result. (This is similar to the Carry flag testing that should be performed for Unsigned Binary encoded values).
**Sign**- As a convenience the left-most bit of a result is duplicated as another flag, the Sign flag. The Sign flag can be tested following 2's Complement arithmetic to determine if the result of the operation was negative.
**Carry and Overflow Reconsidered for 2's Complement**- the
**Carry flag**has no significance when dealing with 2's Complement encoded values. Note that addition and subtraction are identical for Unsigned Binary and for 2's Complement; it is the programmer's responsibility to test the appropriate flag, either Carry or Overflow. - since the pattern for the zero value is the same for both Unsigned Binary and 2's
Complement encoding, the
**Zero flag**is still of use when working with 2's Complement.