80 likes | 155 Views
CS Club Meeting 4 10/10/13. Meeting Topic: Integers. int s in Java and C++ are 4 bytes and signed long long (C++) and long (Java) are 8 bytes. There are 2^32 different values an int can take on. The smallest is -2^31, the largest is 2^31-1
E N D
Meeting Topic: Integers • ints in Java and C++ are 4 bytes and signed • long long (C++) and long (Java) are 8 bytes. • There are 2^32 different values an int can take on. • The smallest is -2^31, the largest is 2^31-1 • ints are stored as binary numbers. Each of the 32 bits (binary digit) is either 0 or 1 • The first bit is a sign bit; if it is a 1, the number is negative, otherwise it is zero or positive. • The int 1 is represented as 31 0’s followed by a 1 • And the int 0 is 32 0’s.
Two’s Complement Representation • Binary numbers are implemented using “2’s complement” • -1 is 11111111… • Why? • Let’s try decrementing 8 (0000…1000) • 8 - 1 = 7 (0000…0111) • Decrementing 0 (0000…0000) gives you… • 0 - 1 = -1 (1111…1111) • In general, -x + (x-1) = -1 • -x and x-1 are complements; -x = ~(x-1) • ~ is the NOT operator. It flips every bit of an integer • NOT 01111001 is 10000110
Two’s Complement Representation • This makes addition easier and makes sense too. • Let’s try 10’s complement in decimal. • 4 digit decimal integer: ~x is 9999 - x • ~ 1234 = 8765 • Let’s try subtraction • - 3587 = ~3587 + 1 = 6412 + 1 = 6413 • 7892 - 3587 = 7892 + 6413 = 14305 • Keep only last 4 digits: 7892 - 3587 = 4305! • Allows you to do subtraction with addition. • Note that ~x + 1 = 9999 - x + 1 = 10000 - x
Integer Overflow • Integer overflow is when arithmetic attempts to create a value that is too large • Arithmetic with large integers often leads to overflow • If you do 100000 * 100000, you won’t get 10000000000 because that doesn’t fit in an int • In fact, you’ll get 1410065408 (10^10 mod 2^32) • Be careful, even if you use a long! int x = 100000; long long y = x * x; This will still overflow!!!
Integer Overflow Continued • What is 011111… + 1? • This is the transition from INT_MAX to INT_MIN • For what value of x is abs(x) < 0? • SPOILER ALERT! The answer is coming up. • x = INT_MIN (-2^31). int abs(int x) { if (x > 0) return x; else return -x; }
Addition is Easy • Given two base 10 integers a and b, find their sum. • Input Format: • Line 1: Two numbers, a and b. • Output Format: • Line 1: One number, a + b. • Constraints • 5 points: -10^9 <= a,b <= 10^9 • 10 points: -10^18 <= a,b <= 10^18 • 20 points: 0 <= a,b <= 10^100 • 25 points: -10^100 <= a,b <= 10^100
Sample Case Input: -10 999 Output: 989 Sample Explanation: -10 + 999 = 989.