如何将size_t转换为double或int C++

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_tint真正可能溢出.

如果可能的话,设计您的程序,这样您就不需要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)

  • 如所写,是的,如果`data`大于`int`的值,这将导致溢出-这样,可能会引起“有趣的”问题,例如`convertdata`中的负值,以及什么时候您认为尺寸为负数,就知道有些错误。同样,选择的“数据”值可能会导致“转换数据”中的值为零,其他值可能会将大小表示为非常小的正数,尽管原始大小很大。 (2认同)

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)


Ste*_*sop 9

你可以使用Boost numeric_cast.

如果源值超出目标类型的范围,则会引发异常,但在转换为时不会检测到精度损失double.

但是,无论你使用什么函数,你都应该决定在你的值size_t大于的情况下你想要发生什么INT_MAX.如果要检测它,请使用numeric_cast或编写自己的代码进行检查.如果您以某种方式知道它不可能发生,那么您可以使用static_cast抑制警告而无需运行时检查的成本,但在大多数情况下,成本无论如何都无关紧要.