1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 | #include <limits> #include <type_traits> #include <iostream> template <typename T> struct unsigned_integer_traits; template <> struct unsigned_integer_traits<unsigned char> { typedef signed char signed_type; }; template <> struct unsigned_integer_traits<unsigned short int> { typedef signed short int signed_type; }; template <> struct unsigned_integer_traits<unsigned int> { typedef signed int signed_type; }; template <> struct unsigned_integer_traits<unsigned long int> { typedef signed long int signed_type; }; template <> struct unsigned_integer_traits<unsigned long long int> { typedef signed long long int signed_type; }; template <typename T> struct is_2complement_system { typedef typename unsigned_integer_traits<T>::signed_type signed_type; static const bool value = (static_cast<signed_type>(~(T())) == static_cast<signed_type>(-1)); }; template <typename T> const bool is_2complement_system<T>::value; template <typename T, bool is_2complement_system_value> struct unsigned_to_signed_impl; template <typename T> struct unsigned_to_signed_impl<T,true> { typedef typename unsigned_integer_traits<T>::signed_type signed_type; static signed_type convert(T value) { return static_cast<signed_type>(value); } }; template <typename T> struct unsigned_to_signed_impl<T,false> { typedef typename unsigned_integer_traits<T>::signed_type signed_type; static signed_type convert(T value) { // well do something complicated you don't care what return T(); // just for tests } }; template <typename T> typename unsigned_integer_traits<T>::signed_type unsigned_to_signed(T n) { return unsigned_to_signed_impl<T,is_2complement_system<T>::value>::convert(n); } int main() { std::cout << unsigned_to_signed(100u) << '\n' << unsigned_to_signed(0xFFFFffff) << '\n' ; } |
I2luY2x1ZGUgPGxpbWl0cz4KI2luY2x1ZGUgPHR5cGVfdHJhaXRzPgojaW5jbHVkZSA8aW9zdHJlYW0+Cgp0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gc3RydWN0IHVuc2lnbmVkX2ludGVnZXJfdHJhaXRzOwp0ZW1wbGF0ZSA8PiBzdHJ1Y3QgdW5zaWduZWRfaW50ZWdlcl90cmFpdHM8dW5zaWduZWQgY2hhcj4gewogIHR5cGVkZWYgc2lnbmVkIGNoYXIgc2lnbmVkX3R5cGU7Cn07CnRlbXBsYXRlIDw+IHN0cnVjdCB1bnNpZ25lZF9pbnRlZ2VyX3RyYWl0czx1bnNpZ25lZCBzaG9ydCBpbnQ+IHsKICB0eXBlZGVmIHNpZ25lZCBzaG9ydCBpbnQgc2lnbmVkX3R5cGU7Cn07CnRlbXBsYXRlIDw+IHN0cnVjdCB1bnNpZ25lZF9pbnRlZ2VyX3RyYWl0czx1bnNpZ25lZCBpbnQ+IHsKICB0eXBlZGVmIHNpZ25lZCBpbnQgc2lnbmVkX3R5cGU7Cn07CnRlbXBsYXRlIDw+IHN0cnVjdCB1bnNpZ25lZF9pbnRlZ2VyX3RyYWl0czx1bnNpZ25lZCBsb25nIGludD4gewogIHR5cGVkZWYgc2lnbmVkIGxvbmcgaW50IHNpZ25lZF90eXBlOwp9Owp0ZW1wbGF0ZSA8PiBzdHJ1Y3QgdW5zaWduZWRfaW50ZWdlcl90cmFpdHM8dW5zaWduZWQgbG9uZyBsb25nIGludD4gewogIHR5cGVkZWYgc2lnbmVkIGxvbmcgbG9uZyBpbnQgc2lnbmVkX3R5cGU7Cn07CgoKdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CnN0cnVjdCBpc18yY29tcGxlbWVudF9zeXN0ZW0gewogIHR5cGVkZWYgdHlwZW5hbWUgdW5zaWduZWRfaW50ZWdlcl90cmFpdHM8VD46OnNpZ25lZF90eXBlIHNpZ25lZF90eXBlOwogIHN0YXRpYyBjb25zdCBib29sIHZhbHVlID0gKHN0YXRpY19jYXN0PHNpZ25lZF90eXBlPih+KFQoKSkpIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgID09IHN0YXRpY19jYXN0PHNpZ25lZF90eXBlPigtMSkpOwp9Owp0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KY29uc3QgYm9vbCBpc18yY29tcGxlbWVudF9zeXN0ZW08VD46OnZhbHVlOyAKCnRlbXBsYXRlIDx0eXBlbmFtZSBULCBib29sIGlzXzJjb21wbGVtZW50X3N5c3RlbV92YWx1ZT4Kc3RydWN0IHVuc2lnbmVkX3RvX3NpZ25lZF9pbXBsOwoKdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CnN0cnVjdCB1bnNpZ25lZF90b19zaWduZWRfaW1wbDxULHRydWU+IHsKICB0eXBlZGVmIHR5cGVuYW1lIHVuc2lnbmVkX2ludGVnZXJfdHJhaXRzPFQ+OjpzaWduZWRfdHlwZSBzaWduZWRfdHlwZTsKICBzdGF0aWMgc2lnbmVkX3R5cGUgY29udmVydChUIHZhbHVlKSAKICB7IAogICAgIHJldHVybiBzdGF0aWNfY2FzdDxzaWduZWRfdHlwZT4odmFsdWUpOyAKICB9Cn07Cgp0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4Kc3RydWN0IHVuc2lnbmVkX3RvX3NpZ25lZF9pbXBsPFQsZmFsc2U+IHsKICB0eXBlZGVmIHR5cGVuYW1lIHVuc2lnbmVkX2ludGVnZXJfdHJhaXRzPFQ+OjpzaWduZWRfdHlwZSBzaWduZWRfdHlwZTsKICBzdGF0aWMgc2lnbmVkX3R5cGUgY29udmVydChUIHZhbHVlKSAKICB7IAogICAgIC8vIHdlbGwgZG8gc29tZXRoaW5nIGNvbXBsaWNhdGVkIHlvdSBkb24ndCBjYXJlIHdoYXQKICAgICByZXR1cm4gVCgpOyAvLyBqdXN0IGZvciB0ZXN0cyAKICB9Cn07Cgp0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KdHlwZW5hbWUgdW5zaWduZWRfaW50ZWdlcl90cmFpdHM8VD46OnNpZ25lZF90eXBlICB1bnNpZ25lZF90b19zaWduZWQoVCBuKQp7CiAgICByZXR1cm4gdW5zaWduZWRfdG9fc2lnbmVkX2ltcGw8VCxpc18yY29tcGxlbWVudF9zeXN0ZW08VD46OnZhbHVlPjo6Y29udmVydChuKTsKfQoKaW50IG1haW4oKSB7CiAgc3RkOjpjb3V0IAogICAgPDwgdW5zaWduZWRfdG9fc2lnbmVkKDEwMHUpIDw8ICdcbicKICAgIDw8IHVuc2lnbmVkX3RvX3NpZ25lZCgweEZGRkZmZmZmKSA8PCAnXG4nCjsKCn0=
-
upload with new input
-
result: Success time: 0s memory: 2928 kB returned value: 0
100 -1


