在不损失精度的情况下键入转换

时间:2016-08-20 21:49:31

标签: c++ c++11 type-conversion

我刚刚注意到我正在使用的框架中的一些代码将某些变量转换为双精度,然后在框架访问它们时将其转换回来。在C ++ 11标准中,这是否可以保证在不损失任何整数类型的精度的情况下工作?如果是这样,哪个?在常见的实现中,是否存在对这种转换普遍安全的其他类型?

另外,有没有办法在编译时检查转换是否安全?基本上我想要像:

//...
void CppClass::some_member()
{
    //...
    ::c_func_x(32, &data); // call to function in c_header_1
    //...
    ::c_func_y(&data2); // call to function in c_header_2
    ::c_function(data3, len, st);
}

2 个答案:

答案 0 :(得分:2)

如果整数类型T(double(T_value))==T_value的范围是T类型的精确整数值范围的子范围,则保证

double

由于double的实现没有16位或更少的尾数,并且因为据我所知,没有现存的C ++实现,每字节超过16位(CHAR_BIT常量来自{ {1}}),此保证适用于<limits.h>以及明确的charsigned变体。

通常unsigned有50位以上的尾数,这足以保证32位整数类型,但不适用于64位。

答案 1 :(得分:0)

好吧,我(大部分)想出了我问题的第二部分:

#include <limits>
static_assert(T(double(std::numeric_limits<T>::max()))==std::numeric_limits::max(),"ERROR MESSAGE.");