When casting between data types in C++ there is a multitude of different ways things can go wrong:
- You might lose a value if casting to a integer type of lower bit length
- You lose a value if casting a negative value to an unsigned integer
- If casting from a pointer to any other integer than uintptr_t, the correct address might become wrong as C++ only guarantees that uintptr_t is the only integer type to withhold an address
- If casting from double to float, the result might be int if the double value is too large for float to withhold
- If casting between pointers with a static_cast(), we might get undefined behavior if the types aren't sharing a common base class
In order to make our code more ...