Binary numbers and arithmetic ADDITION Addition (decimal) 1 5 4 14 5 19 1 5 5 10 1 6 5 11 11 12 99 111 Addition (binary) 0 1 0 0 0 1 0 1 1 1 1 1 10 Addition (binary) 1 11 1 011 01 01011 11000 Addition (binary) 0 1 0 0 0 1 0 1 1 So can we count in binary? 1 1 1 10 Counting in binary (4 bits) 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 0000 0001 … MULTIPLICATION Multiplication (decimal) 13 11 13 130 143 Multiplication (binary) 1101 1011 1101 11010 1101000 10001111 Multiplication (binary) It’s interesting to note that binary multiplication is a sequence of shifts and adds of the first term (depending on the bits in the second term. 1101 1011 1101 11010 1101000 10001111 110100 is missing here because the corresponding bit in the second terms is 0. REPRESENTING SIGNED (POSITIVE AND NEGATIVE) NUMBERS Representing numbers (ints) • Fixed, finite number of bits. bits 8 16 32 64 bytes 1 2 4 8 C/C++ char short int or long long long Intel [s]byte [s]word [s]dword [s]qword Sun byte half word xword Representing numbers (ints) • Fixed, finite number of bits. bits 8 16 32 64 Intel [s]byte [s]word [s]dword [s]qword signed -27..+27-1 -215..+215-1 -231..+231-1 -263..+263-1 unsigned 0..+28-1 0..+216-1 0..+232-1 0..+264-1 In general, for k bits, the unsigned range is [0..+2k-1] and the signed range is [-2k-1..+2k-1-1]. Methods for representing signed ints. 1. signed magnitude 2. 1’s complement (diminished radix complement) 3. 2’s complement (radix complement) 4. excess bD-1 Signed magnitude • Ex. 4-bit signed magnitude – 1 bit for sign – 3 bits for magnitude N N 0 0000 1000 1 2 3 4 5 6 7 0001 0010 0011 0100 0101 0110 0111 1001 1010 1011 1100 1101 1110 1111 Signed magnitude • Ex. 4-bit signed magnitude – 1 bit for sign – 3 bits for magnitude N N 0 0000 1000 1 2 3 4 5 6 7 0001 0010 0011 0100 0101 0110 0111 1001 1010 1011 1100 1101 1110 1111 1’s complement (diminished radix complement) • Let x be a non-negative number. • Then –x is represented by bD-1+(-x) where b = base D = (total) # of bits (including the sign bit) • Ex. Let b=2 and D=4. Then -1 is represented by 24-1-1 = 1410 or 11102. 1’s complement (diminished radix complement) • Let x be a non-negative number. • Then –x is represented by bD-1+(-x) where b = base & D = (total) # of bits (including the sign bit) • Ex. What is the 9’s complement of 1238910? Given b=10 and D=5. Then the 9’s complement of 12389 = 105 – 1 – 12389 = 100000 – 1 – 12389 = 99999 – 12389 = 87610 1’s complement (diminished radix complement) N N • Let x be a non-negative number. 0 0000 1111 • Then –x is represented by bD1+(-x) where 1 0001 1110 b = base D = (total) # of bits (including the sign bit) • Shortcut for base 2? – All combinations used, but 2 zeros! 2 0010 1101 3 0011 1100 4 5 6 7 0100 0101 0110 0111 1011 1010 1001 1000 2’s complement (radix complement) • Let x be a non-negative number. • Then –x is represented by bD+(-x). – Ex. Let b=2 and D=4. Then -1 is represented by 241 = 15 or 11112. – Ex. Let b=2 and D=4. Then -5 is represented by 24 – 5 = 11 or 10112. – Ex. Let b=10 and D=5. Then the 10’s complement of 12389 = 105 – 12389 = 100000 – 12389 = 87611. 2’s complement (radix complement) N N • Let x be a non-negative number. • Then –x is represented by bD+(- 0 0000 0000 x). 1 0001 1111 – Ex. Let b=2 and D=4. Then -1 is represented by 24-1 = 15 or 11112. – Ex. Let b=2 and D=4. Then -5 is represented by 24 – 5 = 11 or 10112. • Shortcut for base 2? 2 0010 1110 3 0011 1101 4 5 6 7 0100 0101 0110 0111 1100 1011 1010 1001 2’s complement (radix complement) • Shortcut for base 2? – Yes! Flip the bits and add 1. N N 0 0000 0000 1 0001 1111 2 0010 1110 3 0011 1101 4 5 6 7 0100 0101 0110 0111 1100 1011 1010 1001 2’s complement (radix complement) • Are all combinations of 4 bits used? N N 0 0000 0000 – No. (Now we only have one zero.) – 1000 is missing! 1 0001 1111 2 0010 1110 3 0011 1101 • What is 1000? • Is it positive or negative? • Does -8 + 1 = -7 work in 2’s complement? 4 5 6 7 0100 0101 0110 0111 1100 1011 1010 1001 excess bD-1 (biased representation) • For pos, neg, and 0, x is represented by bD-1 + x • Ex. Let b=2 and D=4. Then the excess 8 (24-1) representation for 0 is 8+0 = 8 or 10002. • Ex. Let b=2 and D=4. Then excess 8 for -1 is 8 – 1 = 7 or 01112. excess bD-1 • For pos, neg, and 0, x is represented by bD-1 + x. • Ex. Let b=2 and D=4. Then the excess 8 (24-1) representation for 0 is 8+0 = 8 or 10002. • Ex. Let b=2 and D=4. Then excess 8 for -1 is 8 – 1 = 7 or 01112. N N 0 1000 1000 1 1001 0111 2 1010 0110 3 1011 0101 4 5 6 7 1100 1101 1110 1111 0100 0011 0010 0001 2’s complement vs. excess bD-1 • In 2’s, positives start with 0; in excess, positives start with 1. N N 0 1000 1000 • Both have one zero (positive). 1 1001 0111 2 1010 0110 3 1011 0101 • Remaining bits are the same. 4 5 6 7 1100 1101 1110 1111 0100 0011 0010 0001 Summary of methods for representing signed ints. signedMag 1sCom p 2 sCom p excess 8 N 0 n 0000 n 1000 n 1111 n 0000 n n 1000 1000 1 0001 1001 1110 1111 0111 1001 2 0010 1010 1101 1110 0110 1010 3 4 5 6 0011 0100 0101 0110 1011 1100 1101 1110 1100 1011 1010 1001 1101 1100 1011 1010 0101 0100 0011 0010 7 0111 1111 1000 1001 0001 1111 1011 1100 1101 1110 1000=-8| 0000 unused Signed magnitude 1’s complement 2’s complement Excess K (biased) BINARY ARITHMETIC Signed magnitude BINARY ARITHMETIC Addition w/ signed magnitude algorithm • For A - B, change the sign of B and perform addition of A + (-B) (as in the next step) • For A + B: • • • • if (Asign==Bsign) then else if (|A|>|B|) then else if (|A|==|B|) then else • Complicated? { { { { R = |A| + |B|; R = |A| - |B|; R = 0; R = |B| - |A|; Rsign = Asign; Rsign = Asign; Rsign = 0; Rsign = Bsign; } } } } 2’s complement BINARY ARITHMETIC Representing numbers (ints) using 2’s complement • Fixed, finite number of bits. bits 8 16 32 64 Intel sbyte sword sdword sqword signed -27..+27-1 -215..+215-1 -231..+231-1 -263..+263-1 In general, for k bits, the signed range is [-2k-1..+2k-1-1]. So where does the extra negative value come from? Representing numbers (ints) n • Fixed, finite number of bits. bits 8 16 32 64 Intel sbyte sword sdword sqword signed -27..+27-1 -215..+215-1 -231..+231-1 -263..+263-1 In general, for k bits, the signed range is [-2k-1..+2k-1-1]. So where does the extra negative value come from? n 0 0000 0000 1 0001 1111 2 0010 1110 3 0011 1101 4 5 6 7 8 0100 0101 0110 0111 1100 1011 1010 1001 1000 Addition of 2’s complement binary numbers • Consider 8-bit 2’s complement binary numbers. – Then the msb (bit 7) is the sign bit. If this bit is 0, then this is a positive number; if this bit is 1, then this is a negative number. 1 1 1 – Addition of 2 positive numbers. – Ex. 40 + 58 = 98 0 01 01000 0 0111010 01100010 Addition of 2’s complement binary numbers • Consider 8-bit 2’s complement binary numbers. – Addition of a negative to a positive. – What are the values of these 2 terms? • -88 and 122 • -88 + 122 = 34 1 1 1 1 1 01 01000 01111010 1 00100010 So how can we perform subtraction? Addition of 2’s complement binary numbers • Consider 8-bit 2’s complement binary numbers. • Subtraction is nothing but addition of the 2’s complement. – Ex. 58 – 40 = 58 + (-40) = 18 discard carry 1 1 11 0 0111010 11011000 1 00010010 Carry vs. overflow Addition of 2’s complement binary numbers • Carry vs. overflow when adding A + B – If A and B are of opposite sign, then overflow cannot occur. – If A and B are of the same sign but the result is of the opposite sign, then overflow has occurred (and the answer is therefore incorrect). • Overflow occurs iff the carry into the sign bit differs from the carry out of the sign bit. Addition of 2’s complement binary numbers #include <stdio.h> class test { public static void main ( String args[] ) { byte A = 127; byte B = 127; byte result = (byte)(A + B); System.out.println( "A + B = " + result ); } } int main ( int argc, char* argv[] ) { char A = 127; char B = 127; char result = (char)(A + B); printf( "A + B = %d \n", result ); return 0; } Result = -2 in both Java (left) and C++ (right). Why? Addition of 2’s complement binary numbers class test { public static void main ( String args[] ) { byte A = 127; byte B = 127; byte result = (byte)(A + B); System.out.println( "A + B = " + result ); } } Result = -2 in both Java and C++. Why? What’s 127 as a 2’s complement binary number? 01111111 01111111 11111110 What is 111111102? Flip the bits: 00000001. Then add 1: 00000010. This is -2. 1’s complement BINARY ARITHMETIC Addition with 1’s complement • Note: 1’s complement has two 0’s! • 1’s complement addition is tricky (end-around-carry). N N 0 0000 1111 1 0001 1110 2 0010 1101 3 0011 1100 4 5 6 7 0100 0101 0110 0111 1011 1010 1001 1000 8-bit 1’s complement addition • Ex. Let X = A816 and Y = 8616. • Calculate Y - X using 1’s complement. 8-bit 1’s complement addition • Ex. Let X = A816 and Y = 8616. • Calculate Y - X using 1’s complement. Y = 1000 01102 = -12110 X = 1010 10002 = -8710 ~X = 0101 01112 (Note: C=0 out of msb.) 10000110 01010111 1101 1101 Y - X = -121 + 87 = -34 (base 10) 8-bit 1’s complement addition • Ex. Let X = A816 and Y = 8616. • Calculate X - Y using 1’s complement. 8-bit 1’s complement addition • Ex. Let X = A816 and Y = 8616. • Calculate X - Y using 1’s complement. X = 1010 10002 = -8710 Y = 1000 01102 = -12110 ~Y = 0111 10012 (Note: C=1 out of msb.) 10101000 01111001 1 00100001 end around carry 1 00100010 X - Y = -87 + 121 = 34 (base 10) Excess K (biased) BINARY ARITHMETIC Binary arithmetic and Excess K N (biased) Method: Simply add and then flip the sign bit. -1 +5 -+4 0111 1101 ---0100 -> flip sign -> 1100 +1 -5 --4 1001 0011 ---1100 -> flip sign -> 0100 +1 +5 -+6 1001 1101 ---0110 -> flip sign -> 1110 -1 -5 --6 0111 0011 ---1010 -> toggle sign -> 0010 N 0 1000 1000 1 1001 0111 2 1010 0110 3 1011 0101 4 5 6 7 1100 1101 1110 1111 0100 0011 0010 0001 (Not used for integer arithmetic but employed in IEEE 754 floating point standard.)