[ fromfile: twoscomplement.xml id: twoscomplement ]
This section explains the differences between signed and unsigned integral types.
The underlying binary representation of an object x of any integral type looks like this (assuming n-bit storage):
dn-1dn-2...d2d1d0
where each di is either 0 or 1. The computation of the decimal equivalent value of x depends on whether x is an unsigned or signed type. If x is unsigned, the decimal equivalent value is
dn-1*2n-1 + dn-2*2n-2 +...+ d2*22 + d1*21 + d0*20
The largest (positive) value that can be expressed by an unsigned integer is, therefore,
2n - 1 = 1*2n-1 + 1*2n-2 +...+ 1*22 + 1*21 + 1*20
If x is signed, the decimal equivalent value is
dn-1*-(2n-1) + dn-2*2n-2 +...+ d2*22 + d1*21 + d0*20
The largest (positive) value that can be expressed by a signed integer is
2n-1 - 1 = 0*-(2n-1) + 1*2n-2 +...+ 1*22 + 1*21 + 1*20
This is called “two's complement” representation. To determine the representation of the negative of a signed integer,
Compute the “one's complement” of the number (i.e., replace each bit with its complement).
Add 1 to the “one's complement” produced in the first step.
Suppose that we have a tiny system which uses only 8 bits to represent a number. On this system, the largest unsigned integer would be
11111111 = 128 + 64 + 32 + 16 + 8 + 4 + 2 + 1 = 255
But that same number, interpreted as a signed integer, would be
11111111 = -128 + 64 + 32 + 16 + 8 + 4 + 2 + 1 = -1
| Generated: $Date: 2009-09-08 12:15:32 -0400 (Tue, 08 Sep 2009) $ | © 2009 Alan Ezust and Paul Ezust. |