fork download
  1. #include <iostream>
  2. #include <typeinfo>
  3. #include <cstdint>
  4.  
  5. template <class T>
  6. constexpr T pwrtwo(T exponent) {
  7. return (T(1) << exponent);
  8. }
  9.  
  10. template <class T>
  11. constexpr T pwrtwo_nocast(T exponent) {
  12. return (1 << exponent);
  13. }
  14.  
  15. int main()
  16. {
  17. uint8_t u8 = 7;
  18. uint16_t u16 = 15;
  19. uint32_t u32 = 31;
  20. uint64_t u64 = 63;
  21.  
  22. std::cout << "sizeof(int) is " << sizeof(int) << std::endl;
  23.  
  24. std::cout << "no cast:\n"
  25. << "uint8_t: " << uint64_t(pwrtwo_nocast(u8)) << "\n"
  26. << "uint16_t: " << pwrtwo_nocast(u16) << "\n"
  27. << "uint32_t: " << pwrtwo_nocast(u32) << "\n"
  28. << "uint64_t: " << pwrtwo_nocast(u64) << "\n\n"
  29. << "cast:\n"
  30. << "uint8_t: " << uint64_t(pwrtwo(u8)) << "\n"
  31. << "uint16_t: " << pwrtwo(u16) << "\n"
  32. << "uint32_t: " << pwrtwo(u32) << "\n"
  33. << "uint64_t: " << pwrtwo(u64) << std::endl;
  34. }
  35.  
Success #stdin #stdout 0s 3456KB
stdin
Standard input is empty
stdout
sizeof(int) is 4
no cast:
uint8_t: 128
uint16_t: 32768
uint32_t: 2147483648
uint64_t: 0

cast:
uint8_t: 128
uint16_t: 32768
uint32_t: 2147483648
uint64_t: 9223372036854775808