|
Algorithms and Data Structures in C++
by Alan Parker CRC Press, CRC Press LLC ISBN: 0849371716 Pub Date: 08/01/93 |
| Previous | Table of Contents | Next |
Unsigned notation is used to represent nonnegative integers. The unsigned notation does not support negative numbers or floating point numbers. An n-bit number, A, in unsigned notation is represented as

with a value of

Negative numbers are not representable in unsigned format. The range of numbers in an n-bit unsigned notation is

Zero is uniquely represented in unsigned notation. The following types are used in the C++ programming language to indicate unsigned notation:
The number of bits for each type can be compiler dependent.
Signed-magnitude numbers are used to represent positive and negative integers. Signed-magnitude notation does not support floating-point numbers. An n-bit number, A, in signed-magnitude notation is represented as

with a value of

A number, A, is negative if and only if an - 1 = 1. The range of numbers in an n-bit signed magnitude notation is

The range is symmetrical and zero is not uniquely represented. Computers do not use signed-magnitude notation for integers because of the hardware complexity induced by the representation to support addition.
2s complement notation is used by almost all computers to represent positive and negative integers. An n-bit number, A, in 2s complement notation is represented as

with a value of

A number, A, is negative if and only if an - 1 = 1. From Eq. 1.16, the negative of A, -A, is given as

which can be written as

where
is defined as the unary complement:

The ones complement of a number, A, denoted by
, is defined as

From Eq. 1.18 it can be shown that

To see this note that

and

This yields

Inserting Eq. 1.24 into Eq. 1.22 yields

which gives

By noting

one obtains

which is -A. So whether A is positive or negative the twos complement of A is equivalent to -A.

Note that in this case it is a simpler way to generate the representation of -1. Otherwise you would have to note that

Similarly

However, it is useful to know the representation in terms of the weighted bits. For instance, -5, can be generated from the representation of -1 by eliminating the contribution of 4 in -1:

Similarly, -21, can be realized from -5 by eliminating the positive contribution of 16 from its representation.

The operations can be done in hex as well as binary. For 8-bit 2s complement one has


with all the operations performed in hex. After a little familiarity, hex numbers are generally easier to manipulate. To take the ones complement one handles each hex digit at a time. If w is a hex digit then the 1s complement of w,
, is given as


The range of numbers in an n-bit 2s complement notation is

The range is not symmetric but the number zero is uniquely represented.
The representation in 2s complement arithmetic is similar to an odometer in a car. If the car odometer is reading zero and the car is driven one mile in reverse (-1) then the odometer reads 999999. This is illustrated in Table 1.2.
| 8-Bit 2s Complement | ||
|---|---|---|
| Binary | Value | Odometer |
| 11111110 | -2 | 999998 |
| 11111111 | -1 | 999999 |
| 00000000 | 0 | 000000 |
| 00000001 | 1 | 000001 |
| 00000010 | 2 | 000002 |
Typically, 2s complement representations are used in the C++ programming language with the following declarations:
The number of bits for each type can be compiler dependent. An 8-bit example of the three basic integer representations is shown in Table 1.3.
| 8-Bit Representations | |||
|---|---|---|---|
| Number | Unsigned | Signed Magnitude | 2s Complement |
| -128 | NR† | NR | 10000000 |
| -127 | NR | 11111111 | 10000001 |
| -2 | NR | 10000010 | 11111110 |
| -1 | NR | 10000001 | 11111111 |
| 0 | 00000000 | 00000000 10000000 | 00000000 |
| 1 | 00000001 | 00000001 | 00000001 |
| 127 | 01111111 | 01111111 | 01111111 |
| 128 | 10000000 | NR | NR |
| 255 | 11111111 | NR | NR |
†.Not representable in 8-bit format.
| # Bits | 2s Complement | Unsigned |
|---|---|---|
| 8 | -128≤A≤127 | 0≤A≤255 |
| 16 | -32768≤A≤32767 | 0≤A≤65535 |
| 32 | -2147483648≤A≤2147483647 | 0≤A≤4294967295 |
| n | -2n - 1≤A≤2n - 1-1 | 0≤A≤2n - 1 |
The ranges for 8-, 16-, and 32-bit representations for 2s complement and unsigned representations are shown in Table 1.4.
| Previous | Table of Contents | Next |