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 。 , , 。
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.