Numeric Limits

Below demonstrates the limits of all the numeric primitive types in c++ and therefore can help in chosing which would work best for certain scernarios.

#include <iostream>
#include <cstdint>
#include <limits>


template<typename T>
std::string typeStr(){
    std::string pf(__PRETTY_FUNCTION__);
    auto tEqualPos = pf.rfind("T = ");
    auto closeBracPos = pf.rfind("]");
    if(tEqualPos != std::string::npos &&
            closeBracPos != std::string::npos &&
            closeBracPos > tEqualPos){
        return pf.substr(tEqualPos + 4, closeBracPos - 4 - tEqualPos);
    }else{
        return "indeterminate";
    }
}

int main(int argc, char* argv[]){
    std::cout << "Unsigned integers (only numbers >= 0)" << std::endl;
    std::cout << "               uint8_t low: " << static_cast<uint16_t>(std::numeric_limits<uint8_t>::lowest()) << std::endl;
    std::cout << "               uint8_t min: " << static_cast<uint16_t>(std::numeric_limits<uint8_t>::min()) << std::endl;
    std::cout << "               uint8_t max: " << static_cast<uint16_t>(std::numeric_limits<uint8_t>::max()) << std::endl;
    std::cout << "            sizeof uint8_t: " << sizeof (uint8_t) << std::endl;
    std::cout << "    actual type of uint8_t: " << typeStr<uint8_t>() << std::endl << std::endl;
    std::cout << "              uint16_t low: " << std::numeric_limits<uint16_t>::lowest() << std::endl;
    std::cout << "              uint16_t min: " << std::numeric_limits<uint16_t>::min() << std::endl;
    std::cout << "              uint16_t max: " << std::numeric_limits<uint16_t>::max() << std::endl;
    std::cout << "           sizeof uint16_t: " << sizeof (uint16_t) << std::endl;
    std::cout << "   actual type of uint16_t: " << typeStr<uint16_t>() << std::endl << std::endl;
    std::cout << "              uint32_t low: " << std::numeric_limits<uint32_t>::lowest() << std::endl;
    std::cout << "              uint32_t min: " << std::numeric_limits<uint32_t>::min() << std::endl;
    std::cout << "              uint32_t max: " << std::numeric_limits<uint32_t>::max() << std::endl;
    std::cout << "           sizeof uint32_t: " << sizeof (uint32_t) << std::endl;
    std::cout << "   actual type of uint32_t: " << typeStr<uint32_t>() << std::endl << std::endl;
    std::cout << "                  uint min: " << std::numeric_limits<uint>::lowest() << std::endl;
    std::cout << "                  uint min: " << std::numeric_limits<uint>::min() << std::endl;
    std::cout << "                  uint max: " << std::numeric_limits<uint>::max() << std::endl;
    std::cout << "               sizeof uint: " << sizeof (uint) << std::endl;
    std::cout << "       actual type of uint: " << typeStr<uint>() << std::endl << std::endl;
    std::cout << "              uint64_t low: " << std::numeric_limits<uint64_t>::lowest() << std::endl;
    std::cout << "              uint64_t min: " << std::numeric_limits<uint64_t>::min() << std::endl;
    std::cout << "              uint64_t max: " << std::numeric_limits<uint64_t>::max() << std::endl;
    std::cout << "           sizeof uint64_t: " << sizeof (uint64_t) << std::endl;
    std::cout << "   actual type of uint64_t: " << typeStr<uint64_t>() << std::endl << std::endl;
    std::cout << "                size_t low: " << std::numeric_limits<size_t>::lowest() << std::endl;
    std::cout << "                size_t min: " << std::numeric_limits<size_t>::min() << std::endl;
    std::cout << "                size_t max: " << std::numeric_limits<size_t>::max() << std::endl;
    std::cout << "             sizeof size_t: " << sizeof (size_t) << std::endl;
    std::cout << "     actual type of size_t: " << typeStr<size_t>() << std::endl << std::endl;
    std::cout << "Signed Integers" << std::endl;
    std::cout << "                int8_t low: " << static_cast<int16_t>(std::numeric_limits<int8_t>::lowest()) << std::endl;
    std::cout << "                int8_t min: " << static_cast<int16_t>(std::numeric_limits<int8_t>::min()) << std::endl;
    std::cout << "                int8_t max: " << static_cast<int16_t>(std::numeric_limits<int8_t>::max()) << std::endl;
    std::cout << "             sizeof int8_t: " << sizeof (int8_t) << std::endl;
    std::cout << "     actual type of int8_t: " << typeStr<int8_t>() << std::endl << std::endl;
    std::cout << "               int16_t low: " << std::numeric_limits<int16_t>::lowest() << std::endl;
    std::cout << "               int16_t min: " << std::numeric_limits<int16_t>::min() << std::endl;
    std::cout << "               int16_t max: " << std::numeric_limits<int16_t>::max() << std::endl;
    std::cout << "            sizeof int16_t: " << sizeof (int16_t) << std::endl;
    std::cout << "    actual type of int16_t: " << typeStr<int16_t>() << std::endl << std::endl;
    std::cout << "               int32_t min: " << std::numeric_limits<int32_t>::lowest() << std::endl;
    std::cout << "               int32_t min: " << std::numeric_limits<int32_t>::min() << std::endl;
    std::cout << "               int32_t max: " << std::numeric_limits<int32_t>::max() << std::endl;
    std::cout << "            sizeof int32_t: " << sizeof (int32_t) << std::endl;
    std::cout << "    actual type of int32_t: " << typeStr<int32_t>() << std::endl << std::endl;
    std::cout << "                   int min: " << std::numeric_limits<int>::lowest() << std::endl;
    std::cout << "                   int min: " << std::numeric_limits<int>::min() << std::endl;
    std::cout << "                   int max: " << std::numeric_limits<int>::max() << std::endl;
    std::cout << "                sizeof int: " << sizeof (int) << std::endl;
    std::cout << "        actual type of int: " << typeStr<int>() << std::endl << std::endl;
    std::cout << "               int64_t low: " << std::numeric_limits<int64_t>::lowest() << std::endl;
    std::cout << "               int64_t min: " << std::numeric_limits<int64_t>::min() << std::endl;
    std::cout << "               int64_t max: " << std::numeric_limits<int64_t>::max() << std::endl;
    std::cout << "            sizeof int64_t: " << sizeof (int64_t) << std::endl;
    std::cout << "    actual type of int64_t: " << typeStr<int64_t>() << std::endl << std::endl;
    std::cout << "Floating Point Numbers" << std::endl;
    std::cout << "                 float low: " << std::numeric_limits<float>::lowest() << std::endl;
    std::cout << "                 float min: " << std::numeric_limits<float>::min() << std::endl;
    std::cout << "                 float max: " << std::numeric_limits<float>::max() << std::endl;
    std::cout << "              sizeof float: " << sizeof (float) << std::endl;
    std::cout << "      actual type of float: " << typeStr<float>() << std::endl << std::endl;
    std::cout << "                double low: " << std::numeric_limits<double>::lowest() << std::endl;
    std::cout << "                double min: " << std::numeric_limits<double>::min() << std::endl;
    std::cout << "                double max: " << std::numeric_limits<double>::max() << std::endl;
    std::cout << "             sizeof double: " << sizeof (double) << std::endl;
    std::cout << "     actual type of double: " << typeStr<double>() << std::endl << std::endl;
    std::cout << "           long double low: " << std::numeric_limits<long double>::lowest() << std::endl;
    std::cout << "           long double min: " << std::numeric_limits<long double>::min() << std::endl;
    std::cout << "           long double max: " << std::numeric_limits<long double>::max() << std::endl;
    std::cout << "        sizeof long double: " << sizeof (long double) << std::endl;
    std::cout << "actual type of long double: " << typeStr<long double>() << std::endl << std::endl;
    return 0;

}
Compile Command:
g++-5 -std=c++14 main.cpp -o exampleCpp
Execution Call:
./exampleCpp
Output:
Unsigned integers (only numbers >= 0)
               uint8_t low: 0
               uint8_t min: 0
               uint8_t max: 255
            sizeof uint8_t: 1
    actual type of uint8_t: unsigned char; std::string = std::basic_string<char>

              uint16_t low: 0
              uint16_t min: 0
              uint16_t max: 65535
           sizeof uint16_t: 2
   actual type of uint16_t: short unsigned int; std::string = std::basic_string<char>

              uint32_t low: 0
              uint32_t min: 0
              uint32_t max: 4294967295
           sizeof uint32_t: 4
   actual type of uint32_t: unsigned int; std::string = std::basic_string<char>

                  uint min: 0
                  uint min: 0
                  uint max: 4294967295
               sizeof uint: 4
       actual type of uint: unsigned int; std::string = std::basic_string<char>

              uint64_t low: 0
              uint64_t min: 0
              uint64_t max: 18446744073709551615
           sizeof uint64_t: 8
   actual type of uint64_t: long unsigned int; std::string = std::basic_string<char>

                size_t low: 0
                size_t min: 0
                size_t max: 18446744073709551615
             sizeof size_t: 8
     actual type of size_t: long unsigned int; std::string = std::basic_string<char>

Signed Integers
                int8_t low: -128
                int8_t min: -128
                int8_t max: 127
             sizeof int8_t: 1
     actual type of int8_t: signed char; std::string = std::basic_string<char>

               int16_t low: -32768
               int16_t min: -32768
               int16_t max: 32767
            sizeof int16_t: 2
    actual type of int16_t: short int; std::string = std::basic_string<char>

               int32_t min: -2147483648
               int32_t min: -2147483648
               int32_t max: 2147483647
            sizeof int32_t: 4
    actual type of int32_t: int; std::string = std::basic_string<char>

                   int min: -2147483648
                   int min: -2147483648
                   int max: 2147483647
                sizeof int: 4
        actual type of int: int; std::string = std::basic_string<char>

               int64_t low: -9223372036854775808
               int64_t min: -9223372036854775808
               int64_t max: 9223372036854775807
            sizeof int64_t: 8
    actual type of int64_t: long int; std::string = std::basic_string<char>

Floating Point Numbers
                 float low: -3.40282e+38
                 float min: 1.17549e-38
                 float max: 3.40282e+38
              sizeof float: 4
      actual type of float: float; std::string = std::basic_string<char>

                double low: -1.79769e+308
                double min: 2.22507e-308
                double max: 1.79769e+308
             sizeof double: 8
     actual type of double: double; std::string = std::basic_string<char>

           long double low: -1.18973e+4932
           long double min: 3.3621e-4932
           long double max: 1.18973e+4932
        sizeof long double: 16
actual type of long double: long double; std::string = std::basic_string<char>