3.6. Converting Between Numeric Types
Problem
You have number of one type
and you need to convert it to another, such as an int
to a short
or a vice versa, but you
want to catch any overflow or underflow errors at runtime.
Solution
Use Boost’s numeric_cast
class template. It
performs runtime checks that throw an exception of type bad_numeric_cast
if you will overflow or underflow the variable where you are
putting a value. Example 3-8 shows you how
to do this.
Example 3-8. Safe numeric conversions
#include <iostream> #include <boost/cast.hpp> using namespace std; using boost::numeric_cast; using boost::bad_numeric_cast; int main() { // Integer sizes try { int i = 32767; short s = numeric_cast<short>(i); cout << "s = " << s << endl; i++; // Now i is out of range (if sizeof(short) is 2) s = numeric_cast<short>(i); } catch (bad_numeric_cast& e) { cerr << e.what() << endl; } try { int i = 300; unsigned int ui = numeric_cast<unsigned int>(i); cout << ui << endl; // Fine i *= -1; ui = numeric_cast<unsigned int>(i); // i is negative! } catch (bad_numeric_cast& e) { cerr << e.what() << endl; } try { double d = 3.14; int i = numeric_cast<int>(d); i = numeric_cast<int>(d); // This shaves off the 0.14! cout << i << endl; // i = 3 } catch (bad_numeric_cast& e) { cerr << e.what() << endl; } }
Discussion
You are probably aware of the fact that the basic C++ types have different sizes. The
C++ standard has strict specifications for the relative size of types—an int
is always at least as big as a
Get C++ Cookbook now with the O’Reilly learning platform.
O’Reilly members experience books, live events, courses curated by job role, and more from O’Reilly and nearly 200 top publishers.