Signed number representations: Difference between revisions
Guy Harris (talk | contribs) →Ones' complement: The entire CDC 160 series used ones' complement. |
m Changed "sign-and-magnitude method" to "signed magnitude representation", which is the term used by Knuth (vol. 2, 3rd edition). |
||
Line 4: | Line 4: | ||
In [[mathematics]], negative numbers in any base are represented by prefixing them with a − sign. However, in [[computer hardware]], numbers are represented in [[bit]] vectors only, without extra symbols. The four best-known methods of extending the [[binary numeral system]] to represent [[signed number]]s are: [[#Sign-and-magnitude method|sign-and-magnitude]], [[#Ones' complement|ones' complement]], [[#Two's complement|two's complement]], and [[#Excess-K|excess-''K'']]. Some of the alternative methods use implicit instead of explicit signs, such as negative binary, using the [[#Base −2|base −2]]. Corresponding methods can be devised for [[positional notation|other bases]], whether positive, negative, fractional, or other elaborations on such themes. There is no definitive criterion by which any of the representations is universally superior. The representation used in most current computing devices is two's complement, although the [[UNIVAC 1100/2200 series|Unisys ClearPath Dorado series]] mainframes use ones' complement. |
In [[mathematics]], negative numbers in any base are represented by prefixing them with a − sign. However, in [[computer hardware]], numbers are represented in [[bit]] vectors only, without extra symbols. The four best-known methods of extending the [[binary numeral system]] to represent [[signed number]]s are: [[#Sign-and-magnitude method|sign-and-magnitude]], [[#Ones' complement|ones' complement]], [[#Two's complement|two's complement]], and [[#Excess-K|excess-''K'']]. Some of the alternative methods use implicit instead of explicit signs, such as negative binary, using the [[#Base −2|base −2]]. Corresponding methods can be devised for [[positional notation|other bases]], whether positive, negative, fractional, or other elaborations on such themes. There is no definitive criterion by which any of the representations is universally superior. The representation used in most current computing devices is two's complement, although the [[UNIVAC 1100/2200 series|Unisys ClearPath Dorado series]] mainframes use ones' complement. |
||
== |
==Signed magnitude representation== |
||
<!-- [[ |
<!-- [[Signed magnitude]] and similar titles redirect here --> |
||
In the first approach, the problem of representing a number's sign can be to allocate one '''[[sign bit]]''' to represent the sign: set that [[bit]] (often the [[most significant bit]]) to 0 for a positive number, and set to 1 for a negative number. The remaining bits in the number indicate the magnitude (or [[absolute value]]). Hence in a [[byte]] with only 7 bits (apart from the sign bit), the magnitude can range from 0000000 (0) to 1111111 (127). Thus you can represent numbers from −127<sub>10</sub> to +127<sub>10</sub> once you add the sign bit (the eighth bit). A consequence of this representation is that there are two ways to represent zero, 00000000 (0) and 10000000 ([[−0]]). This way, −43<sub>10</sub> encoded in an eight-bit byte is 10101011. |
In the first approach, the problem of representing a number's sign can be to allocate one '''[[sign bit]]''' to represent the sign: set that [[bit]] (often the [[most significant bit]]) to 0 for a positive number, and set to 1 for a negative number. The remaining bits in the number indicate the magnitude (or [[absolute value]]). Hence in a [[byte]] with only 7 bits (apart from the sign bit), the magnitude can range from 0000000 (0) to 1111111 (127). Thus you can represent numbers from −127<sub>10</sub> to +127<sub>10</sub> once you add the sign bit (the eighth bit). A consequence of this representation is that there are two ways to represent zero, 00000000 (0) and 10000000 ([[−0]]). This way, −43<sub>10</sub> encoded in an eight-bit byte is 10101011. |
||
This approach is directly comparable to the common way of showing a sign (placing a "+" or "−" next to the number's magnitude). Some early binary computers (e.g., [[IBM 7090]]) used this representation, perhaps because of its natural relation to common usage. |
This approach is directly comparable to the common way of showing a sign (placing a "+" or "−" next to the number's magnitude). Some early binary computers (e.g., [[IBM 7090]]) used this representation, perhaps because of its natural relation to common usage. Signed magnitude is the most common way of representing the [[significand]] in [[floating point]] values. |
||
==Ones' complement== |
==Ones' complement== |
Revision as of 21:37, 7 August 2013
This article needs additional citations for verification. (April 2013) |
In computing, signed number representations are required to encode negative numbers in binary number systems.
In mathematics, negative numbers in any base are represented by prefixing them with a − sign. However, in computer hardware, numbers are represented in bit vectors only, without extra symbols. The four best-known methods of extending the binary numeral system to represent signed numbers are: sign-and-magnitude, ones' complement, two's complement, and excess-K. Some of the alternative methods use implicit instead of explicit signs, such as negative binary, using the base −2. Corresponding methods can be devised for other bases, whether positive, negative, fractional, or other elaborations on such themes. There is no definitive criterion by which any of the representations is universally superior. The representation used in most current computing devices is two's complement, although the Unisys ClearPath Dorado series mainframes use ones' complement.
Signed magnitude representation
In the first approach, the problem of representing a number's sign can be to allocate one sign bit to represent the sign: set that bit (often the most significant bit) to 0 for a positive number, and set to 1 for a negative number. The remaining bits in the number indicate the magnitude (or absolute value). Hence in a byte with only 7 bits (apart from the sign bit), the magnitude can range from 0000000 (0) to 1111111 (127). Thus you can represent numbers from −12710 to +12710 once you add the sign bit (the eighth bit). A consequence of this representation is that there are two ways to represent zero, 00000000 (0) and 10000000 (−0). This way, −4310 encoded in an eight-bit byte is 10101011.
This approach is directly comparable to the common way of showing a sign (placing a "+" or "−" next to the number's magnitude). Some early binary computers (e.g., IBM 7090) used this representation, perhaps because of its natural relation to common usage. Signed magnitude is the most common way of representing the significand in floating point values.
Ones' complement
Binary value | Ones' complement interpretation | Unsigned interpretation |
---|---|---|
00000000 | +0 | 0 |
00000001 | 1 | 1 |
⋮ | ⋮ | ⋮ |
01111101 | 125 | 125 |
01111110 | 126 | 126 |
01111111 | 127 | 127 |
10000000 | −127 | 128 |
10000001 | −126 | 129 |
10000010 | −125 | 130 |
⋮ | ⋮ | ⋮ |
11111101 | −2 | 253 |
11111110 | −1 | 254 |
11111111 | −0 | 255 |
Alternatively, a system known as ones' complement can be used to represent negative numbers. The ones' complement form of a negative binary number is the bitwise NOT applied to it — the "complement" of its positive counterpart. Like sign-and-magnitude representation, ones' complement has two representations of 0: 00000000 (+0) and 11111111 (−0).
As an example, the ones' complement form of 00101011 (4310) becomes 11010100 (−4310). The range of signed numbers using ones' complement is represented by −(2N−1−1) to (2N−1−1) and ±0. A conventional eight-bit byte is −12710 to +12710 with zero being either 00000000 (+0) or 11111111 (−0).
To add two numbers represented in this system, one does a conventional binary addition, but it is then necessary to do an end-around carry: that is, add any resulting carry back into the resulting sum. To see why this is necessary, consider the following example showing the case of the addition of −1 (11111110) to +2 (00000010).
binary decimal 11111110 −1 + 00000010 +2 ............ … 1 00000000 0 ← Not the correct answer 1 +1 ← Add carry ............ … 00000001 1 ← Correct answer
In the previous example, the binary addition alone gives 00000000, which is incorrect. Only when the carry is added back in does the correct result (00000001) appear.
This numeric representation system was common in older computers; the PDP-1, CDC 160 series, and UNIVAC 1100/2200 series, among many others, used ones'-complement arithmetic.
A remark on terminology: The system is referred to as "ones' complement" because the negation of a positive value x (represented as the bitwise NOT of x) can also be formed by subtracting x from the ones' complement representation of zero that is a long sequence of ones (−0). Two's complement arithmetic, on the other hand, forms the negation of x by subtracting x from a single large power of two that is congruent to +0.[1] Therefore, ones' complement and two's complement representations of the same negative value will differ by one.
Note that the ones' complement representation of a negative number can be obtained from the sign-magnitude representation merely by bitwise complementing the magnitude.
Two's complement
Binary value | Two's complement interpretation | Unsigned interpretation |
---|---|---|
00000000 | 0 | 0 |
00000001 | 1 | 1 |
⋮ | ⋮ | ⋮ |
01111110 | 126 | 126 |
01111111 | 127 | 127 |
10000000 | −128 | 128 |
10000001 | −127 | 129 |
10000010 | −126 | 130 |
⋮ | ⋮ | ⋮ |
11111110 | −2 | 254 |
11111111 | −1 | 255 |
The problems of multiple representations of 0 and the need for the end-around carry are circumvented by a system called two's complement. In two's complement, negative numbers are represented by the bit pattern which is one greater (in an unsigned sense) than the ones' complement of the positive value.
In two's-complement, there is only one zero, represented as 00000000. Negating a number (whether negative or positive) is done by inverting all the bits and then adding 1 to that result. This actually reflects the ring structure on all integers modulo 2N: . Addition of a pair of two's-complement integers is the same as addition of a pair of unsigned numbers (except for detection of overflow, if that is done); the same is true for subtraction and even for N lowest significant bits of a product (value of multiplication). For instance, a two's-complement addition of 127 and −128 gives the same binary bit pattern as an unsigned addition of 127 and 128, as can be seen from the 8 bit two's complement table.
An easier method to get the negation of a number in two's complement is as follows:
Example 1 | Example 2 | |
---|---|---|
1. Starting from the right, find the first '1' | 0101001 | 0101100 |
2. Invert all of the bits to the left of that one | 1010111 | 1010100 |
Method two:
- Invert all the bits through the number
- Add one
Example: for +1 which is 00000001 in binary:
- ~00000001 → 11111110
- 11111110 + 1 → 11111111 (−1 in two's complement)
Excess-K
Binary value | Excess-127 interpretation | Unsigned interpretation |
---|---|---|
00000000 | −127 | 0 |
00000001 | −126 | 1 |
⋮ | ⋮ | ⋮ |
01111111 | 0 | 127 |
10000000 | 1 | 128 |
⋮ | ⋮ | ⋮ |
11111111 | +128 | 255 |
Excess-K, also called offset binary or biased representation, uses a pre-specified number K as a biasing value. A value is represented by the unsigned number which is K greater than the intended value. Thus 0 is represented by K, and −K is represented by the all-zeros bit pattern. This can be seen as a slight modification and generalization of the aforementioned two's-complement, which is virtually the excess-2N−1 representation with negated most significant bit.
Biased representations are now primarily used for the exponent of floating-point numbers. The IEEE floating-point standard defines the exponent field of a single-precision (32-bit) number as an 8-bit excess-127 field. The double-precision (64-bit) exponent field is an 11-bit excess-1023 field; see exponent bias. It also had use for binary coded decimal numbers as excess-3.
Base −2
In conventional binary number systems, the base, or radix, is 2; thus the rightmost bit represents 20, the next bit represents 21, the next bit 22, and so on. However, a binary number system with base −2 is also possible. The rightmost bit represents (−2)0 = +1, the next bit represents (−2)1 = −2, the next bit (−2)2 = +4 and so on, with alternating sign. The numbers that can be represented with four bits are shown in the comparison table below.
The range of numbers that can be represented is asymmetric. If the word has an even number of bits, the magnitude of the largest negative number that can be represented is twice as large as the largest positive number that can be represented, and vice versa if the word has an odd number of bits.
Comparison table
The following table shows the positive and negative integers that can be represented using 4 bits.
Decimal | Unsigned | Sign and magnitude | Ones' complement | Two's complement | Excess-7 (biased) | Base −2 |
---|---|---|---|---|---|---|
+16 | — | — | — | — | — | — |
+15 | 1111 | — | — | — | — | — |
+14 | 1110 | — | — | — | — | — |
+13 | 1101 | — | — | — | — | — |
+12 | 1100 | — | — | — | — | — |
+11 | 1011 | — | — | — | — | — |
+10 | 1010 | — | — | — | — | — |
+9 | 1001 | — | — | — | — | — |
+8 | 1000 | — | — | — | 1111 | — |
+7 | 0111 | 0111 | 0111 | 0111 | 1110 | — |
+6 | 0110 | 0110 | 0110 | 0110 | 1101 | — |
+5 | 0101 | 0101 | 0101 | 0101 | 1100 | 0101 |
+4 | 0100 | 0100 | 0100 | 0100 | 1011 | 0100 |
+3 | 0011 | 0011 | 0011 | 0011 | 1010 | 0111 |
+2 | 0010 | 0010 | 0010 | 0010 | 1001 | 0110 |
+1 | 0001 | 0001 | 0001 | 0001 | 1000 | 0001 |
+0 | 0000 | 0000 | 0000 | 0000 | 0111 | 0000 |
−0 | 1000 | 1111 | ||||
−1 | — | 1001 | 1110 | 1111 | 0110 | 0011 |
−2 | — | 1010 | 1101 | 1110 | 0101 | 0010 |
−3 | — | 1011 | 1100 | 1101 | 0100 | 1101 |
−4 | — | 1100 | 1011 | 1100 | 0011 | 1100 |
−5 | — | 1101 | 1010 | 1011 | 0010 | 1111 |
−6 | — | 1110 | 1001 | 1010 | 0001 | 1110 |
−7 | — | 1111 | 1000 | 1001 | 0000 | 1001 |
−8 | — | — | — | 1000 | — | 1000 |
−9 | — | — | — | — | — | 1011 |
−10 | — | — | — | — | — | 1010 |
−11 | — | — | — | — | — | — |
Other systems
Google's Protocol Buffers "zig-zag encoding" is a system similar to sign-and-magnitude, but uses the least significant bit to represent the sign and has a single representation of zero. This has the advantage to make variable-length quantity encoding efficient with signed integers.[2]
Apache Thrift is another such method developed by Facebook in 2007 that is similar to Protocol Buffers for scalable cross-language services development and to serialize the data in efficient way.
Another approach is to give each digit a sign, yielding the signed-digit representation. For instance, in 1726, John Colson advocated reducing expressions to "small numbers", numerals 1, 2, 3, 4, and 5. In 1840, Augustin Cauchy also expressed preference for such modified decimal numbers to reduce errors in computation.
See also
References
- ^ Donald Knuth: The Art of Computer Programming, Volume 2: Seminumerical Algorithms, chapter 4.1
- ^ Protocol Buffers: Signed Integers
- Ivan Flores, The Logic of Computer Arithmetic, Prentice-Hall (1963)
- Israel Koren, Computer Arithmetic Algorithms, A.K. Peters (2002), ISBN 1-56881-160-8