Boost.Multiprecisionの独自実装されている多倍長整数には、チェックなしバージョンとチェック付きバージョンがあります。
cpp_intやint128_tはチェックなしバージョンで、オーバーフローや符号のチェックはしません。
チェック付きバージョンは、先頭に「checked_」という名前が付いていて、オーバーフローや、符号なしでマイナス値になった場合などで例外を送出します。
#include <iostream> #include <boost/multiprecision/cpp_int.hpp> using namespace boost::multiprecision; int main() { // オーバーフロー try { checked_int128_t x = std::numeric_limits<checked_int128_t>::max(); ++x; } catch (std::overflow_error& e) { std::cout << e.what() << std::endl; } // 符号なしでマイナスになる try { checked_uint128_t x = 0; --x; } catch (std::range_error& e) { std::cout << e.what() << std::endl; } }
overflow in addition Subtraction resulted in a negative value, but the type is unsigned
ゼロ割りは、チェック付き/チェックなしに関わらず、std::overflow_error例外が送出されます。
#include <iostream> #include <boost/multiprecision/cpp_int.hpp> using namespace boost::multiprecision; int main() { // ゼロ割り try { cpp_int x = 3; cpp_int y = x / 0; } catch (std::overflow_error& e) { std::cout << e.what() << std::endl; } }
Integer Division by zero.
参照:
cpp_int - Boost Multiprecision Library