numeric_cast

#include <iostream>
#include "boost/cast.hpp"
#include "boost/limits.hpp"

int main()
{ 
	std::cout << std::numeric_limits<long>::max()<<std::endl;
	std::cout << std::numeric_limits<short>::max() << std::endl;

	std::cout << "larger_to_smaller example
"; // numeric_cast long l=std::numeric_limits<short>::max(); short s=l; std::cout << "s is: " << s << '
'; s=++l; std::cout << "s is: " << s << "

"; // numeric_cast try { l=std::numeric_limits<short>::max(); s=boost::numeric_cast<short>(l); std::cout << "s is: " << s << '
'; s=boost::numeric_cast<short>(++l); std::cout << "s is: " << s << '
'; } catch(boost::bad_numeric_cast& e) { std::cout << e.what() << '
'; } // : -------------------------------------------------------------------------- unsigned char c; l = std::numeric_limits<unsigned char>::max() + 14; c = l; std::cout << "c is: " << (int)c << '
'; long reduced = l % (std::numeric_limits<unsigned char>::max() + 1); std::cout << "reduced is: " << reduced << '
'; // ------------------------------------------------------------------------------ unsigned int ui = std::numeric_limits<unsigned int>::max(); int i; try { std::cout << "Assignment from unsigned int to signed int
"; i = boost::numeric_cast<int>(ui); } catch (boost::bad_numeric_cast& e) { std::cout << e.what() << "

"; } try { std::cout << "Assignment from signed int to unsigned int
"; i = -12; ui = boost::numeric_cast<unsigned int>(i); } catch (boost::bad_numeric_cast& e) { std::cout << e.what() << "

"; } // ------------------- double d = 0.123456789123456; float f = 0.123456; try { f = boost::numeric_cast<float>(d); } catch (boost::bad_numeric_cast& e) { std::cout << e.what(); } return 0; } /* 2147483647 32767 larger_to_smaller example s is: 32767 s is: -32768 s is: 32767 bad numeric conversion: positive overflow c is: 13 reduced is: 13 Assignment from unsigned int to signed int bad numeric conversion: positive overflow Assignment from signed int to unsigned int bad numeric conversion: negative overflow . . . */
<pre name="code" class="cpp">    

numeric_cast
   : "boost/cast.hpp"
                  。  ,long      short      ,     long    short    long       short         ?            ( "        "       )。                       ,            ,              ?              ,           ,           。numeric_cast                    ,            。

        numeric_cast  ,                      。           ,                  。          [7]     ,               ,                ,             。 

            [7]. C++   §4.5-4.9             。

                      ,        。                     ,          ,        。  ,char       int    ,    int char      ,    int        char.                ,                           。  ,               ;                                     。[8]                          ;               。numeric_cast           、   ,        。

[8]       ,           。

  
numeric_cast        C++           ,            。                 。  numeric_cast,       "boost/cast.hpp"。         numeric_cast      int     char,     double     float.

char c=boost::numeric_cast<char>(12);float f=boost::numeric_cast<float>(3.001);
                                 。     numeric_cast    。

              
      (  long)      (  short)  ,                     。      ,   (  ,      )      。                 ;           。C++            :

signed char

short int (short)

int

long int (long)

                  [9],    ,            ,   int   long           。          ,         。             ,     sizeof(T)   std::numeric_limits<T>::max()   std::numeric_limits<T>::min().

[9]   ,                  ,          。

                 ,C++   :

"           ,             ,    ;  ,      。"[10]

[10]  C++   §4.7.3 

                              ,        numeric_cast       。

#include <iostream>#include "boost/cast.hpp"#include "boost/limits.hpp"int main() {  std::cout << "larger_to_smaller example
"; // numeric_cast long l=std::numeric_limits<short>::max(); short s=l; std::cout << "s is: " << s << '
'; s=++l; std::cout << "s is: " << s << "

"; // numeric_cast try { l=std::numeric_limits<short>::max(); s=boost::numeric_cast<short>(l); std::cout << "s is: " << s << '
'; s=boost::numeric_cast<short>(++l); std::cout << "s is: " << s << '
'; } catch(boost::bad_numeric_cast& e) { std::cout << e.what() << '
'; }} std::numeric_limits, long l short 。 short s 。 ,l , short ; short 。 l s, s 。 ? , , 。 , , , 。 [11]。 , , numeric_cast. , 。 , bad_numeric_cast 。 。 [11] 32 。 larger_to_smaller examples is: 32767s is: -32768s is: 32767bad numeric cast: loss of range in numeric_cast ,numeric_cast , 。 , , 。 , , , 。 , , 。 , ,numeric_cast 。 numeric_cast ; 。 , , 。 : , ! , 。 。 ? 。 #include <iostream>#include "boost/limits.hpp"int main() { unsigned char c; long l=std::numeric_limits<unsigned char>::max()+14; c=l; std::cout << "c is: " << (int)c << '
'; long reduced=l%(std::numeric_limits<unsigned char>::max()+1); std::cout << "reduced is: " << reduced << '
';} : c is: 13reduced is: 13 unsigned char , 。 : long reduced=l%(std::numeric_limits<unsigned char>::max()+1); (value wrapping)。 , numeric_cast。 ,numeric_cast 。numeric_cast , 。 , bad_numeric_cast 。 , [12]。 numeric_cast, 。 [12] : , numeric_cast. [13], 。 。 。 。 。 , 。 。 numeric_cast 。 [13] , 。 #include <iostream>#include "boost/limits.hpp"#include "boost/cast.hpp"int main() { unsigned int ui=std::numeric_limits<unsigned int>::max(); int i; try { std::cout << "Assignment from unsigned int to signed int
"; i=boost::numeric_cast<int>(ui); } catch(boost::bad_numeric_cast& e) { std::cout << e.what() << "

"; } try { std::cout << "Assignment from signed int to unsigned int
"; i=-12; ui=boost::numeric_cast<unsigned int>(i); } catch(boost::bad_numeric_cast& e) { std::cout << e.what() << "

"; }} 。 Assignment from unsigned int to signed intbad numeric cast: loss of range in numeric_castAssignment from signed int to unsigned intbad numeric cast: loss of range in numeric_cast : , numeric_cast 。 numeric_cast 。 float, double, long double 。 , 。 double d=0.123456789123456;float f=0.123456;try { f=boost::numeric_cast<float>(d);} catch(boost::bad_numeric_cast& e) { std::cout << e.what();} 。 , double float , C++ 。 ,double float 。 ? , ; 。numeric_cast , 。 double d=127.123456789123456;char c;std::cout << "char type maximum: ";std::cout << (int)std::numeric_limits<char>::max() << "

";c=d;std::cout << "Assignment from double to char:
";std::cout << "double: " << d << "
";std::cout << "char: " << (int)c << "
";std::cout << "Trying the same thing with numeric_cast:
";try { c=boost::numeric_cast<char>(d); std::cout << "double: " << d; std::cout << "char: " << (int)c;} catch(boost::bad_numeric_cast& e) { std::cout << e.what();} 。 , 。 , : template <typename INT, typename FLOAT> bool is_valid_assignment(FLOAT f) { return std::numeric_limits<INT>::max() >= static_cast<INT>(f); } , , 。 。 static_cast , numeric_limits<INT>::max [14]。 , ; , 。 [14] 。 numeric_cast 。 , numeric_cast 。 。 ,numeric_cast bad_numeric_cast 。 , 。 numeric_cast: , ? , 。 C++ ; 。 。 , , , 。numeric_cast static_cast, dynamic_cast, reinterpret_cast 。 , , 。

좋은 웹페이지 즐겨찾기