use*_*639 38 c++ double casting size-t
我的问题是
我有一个size_t数据,但现在我想将它转换为double或int.
如果我做的事情
size_t data = 99999999;
int convertdata = data;
Run Code Online (Sandbox Code Playgroud)
编译器将报告警告.因为它可能溢出
你有一些像boost或其他方法进行转换的方法吗?
Kei*_*son 54
一名演员,正如Blaz Bratanic所说:
size_t data = 99999999;
int convertdata = static_cast<int>(data);
Run Code Online (Sandbox Code Playgroud)
可能会使警告静音(尽管原则上编译器可以警告它喜欢的任何东西,即使有一个演员).
但它并没有解决警告告诉你的问题,即从转换size_t到int真正可能溢出.
如果可能的话,设计您的程序,这样您就不需要将size_t值转换为int.只需将其存储在size_t变量中(就像您已经完成的那样)并使用它.
转换为double不会导致溢出,但可能导致非常大的size_t值的精度损失.同样,将a转换size_t为a 也没有多大意义double; 你仍然可以将值保存在size_t变量中.
(如果你不能避免演员阵容,R Sahu的回答有一些建议,例如在溢出时抛出异常.)
Bla*_*nic 15
静态施法:
static_cast<int>(data);
Run Code Online (Sandbox Code Playgroud)
R S*_*ahu 13
如果您的代码准备好处理溢出错误,那么如果data太大则可以抛出异常.
size_t data = 99999999;
if ( data > INT_MAX )
{
throw std::overflow_error("data is larger than INT_MAX);
}
int convertData = static_cast<int>(data);
Run Code Online (Sandbox Code Playgroud)
你可以使用Boost numeric_cast.
如果源值超出目标类型的范围,则会引发异常,但在转换为时不会检测到精度损失double.
但是,无论你使用什么函数,你都应该决定在你的值size_t大于的情况下你想要发生什么INT_MAX.如果要检测它,请使用numeric_cast或编写自己的代码进行检查.如果您以某种方式知道它不可能发生,那么您可以使用static_cast抑制警告而无需运行时检查的成本,但在大多数情况下,成本无论如何都无关紧要.