Data representation (part 2)

This lesson contains approximately 28 minutes of video content.

Data representation in the computer


Integer representation

Integer representation : sign magnitude

Integer representation : two's complement

Activity: Integer overflow calculator

Graded Playground Autograder

Activity Prompt:

In this problem, you will implement the function ExponentToOverflow with parameters int init_value value and an unsigned int base. The function will multiply init_value by increasing powers of base (base^1, base^2, ..., base^(n-1), base^n) until integer overflow is observed. You can use pow from <cmath>. Should you do so, keep in mind pow returns a double; your program must perform integer arithmetic when multiplying the base raised to the exponent against the init_value.

ExponentToOverflow will return an std::pair<unsigned int, int> (you can use std::make_pair), where the pair's first field is the exponent that base was raised to that caused overflow when multiplied by int init_value. The pair's second field is the number observed when overflow occurred.

For example, if we invoked:

  • ExponentToOverflow(1048, 2);
    • The implementation of ExponentToOverflow would multiply the original value 1048 by base 2 raised to increasing exponent values until overflow was observed.
    • On my machine, this occurred with exponent 21 and the overflow value observed was -2097152000.
    • That is, when we multiplied 1048 * 2^21, integer overflow was observed for the first time: exponents 1 through 20 inclusive did not cause overflow.
  • ExponentToOverflow(-2000, 2);
    • The implementation of ExponentToOverflow would multiply the original value -2000 by base 2 raised to increasing exponent values until overflow was observed.
    • On my machine, this occurred with exponent 21 and the overflow value observed was 100663296 .
    • That is, when we multiplied -2000 * 2^21 , integer overflow was observed for the first time: exponents 1 through 20 inclusive did not cause overflow.
  • ExponentToOverflow(-20000, 4);
    • The implementation of ExponentToOverflow would multiply the original value -20000 by base 4 raised to increasing exponent values until overflow was observed.
    • On my machine, this occurred with exponent 9 and the overflow value observed was -947912704 .
    • For this case, why is the computed overflow value negative when the starting value passed to this function is -20000? Consider that on my machine: -20000 * 4^8 = -1310720000 and -20000 * 4^9 = -947912704. Did you notice that -20000 * 4^9 evaluates to a less negative value than -20000 * 4^8? Consider that std::numeric_limits<int>::min() returns -2,147,483,648 and that -20000 * 4^9 should equal -5,242,880,000. Do you see what's going on? An int cannot store the result of -20000 * 4^9 since it's outside the type's range. Consider such cases for positive and negative init_values! You can do this by comparing the value you computed with exponent n to the value computed with exponent n - 1. If the result computed with exponent n has the same sign but is less than that computed with exponent n - 1, you've observed an overflow.

#include <iostream> #include <limits> #include "solution.hpp" int main() { // std::pair<unsigned int, int> result_overflow_1 = ExponentToOverflow(1048, 2); // std::cout << result_overflow_1.first << '\t' << result_overflow_1.second << std::endl; // std::pair<unsigned int, int> result_overflow_2 = ExponentToOverflow(-20000, 4); // std::cout << result_overflow_2.first << '\t' << result_overflow_2.second << std::endl; }
#ifndef SOLUTION_HPP #define SOLUTION_HPP #include <utility> std::pair<unsigned int, int> ExponentToOverflow(int init_value, unsigned int base); #endif
#include "solution.hpp" #include <cmath> #include <iostream> std::pair<unsigned int, int> ExponentToOverflow(int init_value, unsigned int base) { }