#include <iostream>
#include <type_traits>
#include <limits>
using namespace std;
template <class integral_type>
typename std::enable_if<std::is_integral<integral_type>::value, integral_type>::type NoOverflowMult(const integral_type a, const integral_type b)
{
if (!a || !b)
return integral_type();
integral_type bound = ((a < 0) != (b < 0) ? std::numeric_limits<integral_type>::min() : std::numeric_limits<integral_type>::max());
if (std::abs(bound / a) < std::abs(b))
return bound;
return a*b;
}
int main()
{
std::cout << "int" << std::endl;
int ai = 2147483600;
int bi = -1234;
std::cout << ai << " * " << bi << " = " << NoOverflowMult(ai,bi) << std::endl;
ai = std::numeric_limits<int>::min ();
bi = 2;
std::cout << ai << " * " << bi << " = " << NoOverflowMult(ai,bi) << std::endl;
std::cout << "unsigned short" << std::endl;
unsigned short aus = 65000;
unsigned short bus = 2;
std::cout << aus << " * " << bus << " = " << NoOverflowMult(aus,bus) << std::endl;
aus = std::numeric_limits<unsigned short>::max();
bus = std::numeric_limits<unsigned short>::min();
std::cout << aus << " * " << bus << " = " << NoOverflowMult(aus,bus) << std::endl;
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dHlwZV90cmFpdHM+CiNpbmNsdWRlIDxsaW1pdHM+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7CgogICAgdGVtcGxhdGUgPGNsYXNzIGludGVncmFsX3R5cGU+CiAgICB0eXBlbmFtZSBzdGQ6OmVuYWJsZV9pZjxzdGQ6OmlzX2ludGVncmFsPGludGVncmFsX3R5cGU+Ojp2YWx1ZSwgaW50ZWdyYWxfdHlwZT46OnR5cGUgTm9PdmVyZmxvd011bHQoY29uc3QgaW50ZWdyYWxfdHlwZSBhLCBjb25zdCBpbnRlZ3JhbF90eXBlIGIpCiAgICB7CiAgICAJaWYgKCFhIHx8ICFiKQogICAgCQlyZXR1cm4gaW50ZWdyYWxfdHlwZSgpOwogICAgCiAgICAJaW50ZWdyYWxfdHlwZSBib3VuZCA9ICgoYSA8IDApICE9IChiIDwgMCkgPyBzdGQ6Om51bWVyaWNfbGltaXRzPGludGVncmFsX3R5cGU+OjptaW4oKSA6IHN0ZDo6bnVtZXJpY19saW1pdHM8aW50ZWdyYWxfdHlwZT46Om1heCgpKTsKICAgIAogICAgCWlmIChzdGQ6OmFicyhib3VuZCAvIGEpIDwgc3RkOjphYnMoYikpCiAgICAJCXJldHVybiBib3VuZDsKICAgIAlyZXR1cm4gYSpiOwogICAgfQoKaW50IG1haW4oKSAKewoJc3RkOjpjb3V0IDw8ICJpbnQiIDw8IHN0ZDo6ZW5kbDsKCWludCBhaSA9IDIxNDc0ODM2MDA7CglpbnQgYmkgPSAtMTIzNDsKCXN0ZDo6Y291dCA8PCBhaSA8PCAiICogIiA8PCBiaSA8PCAiID0gIiA8PCBOb092ZXJmbG93TXVsdChhaSxiaSkgPDwgc3RkOjplbmRsOwoJYWkgPSBzdGQ6Om51bWVyaWNfbGltaXRzPGludD46Om1pbiAoKTsKCWJpID0gMjsKCXN0ZDo6Y291dCA8PCBhaSA8PCAiICogIiA8PCBiaSA8PCAiID0gIiA8PCBOb092ZXJmbG93TXVsdChhaSxiaSkgPDwgc3RkOjplbmRsOwoJCglzdGQ6OmNvdXQgPDwgInVuc2lnbmVkIHNob3J0IiA8PCBzdGQ6OmVuZGw7CgkKCXVuc2lnbmVkIHNob3J0IGF1cyA9IDY1MDAwOwoJdW5zaWduZWQgc2hvcnQgYnVzID0gMjsKCXN0ZDo6Y291dCA8PCBhdXMgPDwgIiAqICIgPDwgYnVzIDw8ICIgPSAiIDw8IE5vT3ZlcmZsb3dNdWx0KGF1cyxidXMpIDw8IHN0ZDo6ZW5kbDsKCWF1cyA9IHN0ZDo6bnVtZXJpY19saW1pdHM8dW5zaWduZWQgc2hvcnQ+OjptYXgoKTsKCWJ1cyA9IHN0ZDo6bnVtZXJpY19saW1pdHM8dW5zaWduZWQgc2hvcnQ+OjptaW4oKTsKCXN0ZDo6Y291dCA8PCBhdXMgPDwgIiAqICIgPDwgYnVzIDw8ICIgPSAiIDw8IE5vT3ZlcmZsb3dNdWx0KGF1cyxidXMpIDw8IHN0ZDo6ZW5kbDsKCXJldHVybiAwOwp9