我刚刚注意到我正在使用的框架中的一些代码将某些变量转换为双精度,然后在框架访问它们时将其转换回来。在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);
}
答案 0 :(得分:2)
T(double(T_value))==T_value
的范围是T
类型的精确整数值范围的子范围,则保证 double
。
由于double
的实现没有16位或更少的尾数,并且因为据我所知,没有现存的C ++实现,每字节超过16位(CHAR_BIT
常量来自{ {1}}),此保证适用于<limits.h>
以及明确的char
和signed
变体。
通常unsigned
有50位以上的尾数,这足以保证32位整数类型,但不适用于64位。
答案 1 :(得分:0)
好吧,我(大部分)想出了我问题的第二部分:
#include <limits>
static_assert(T(double(std::numeric_limits<T>::max()))==std::numeric_limits::max(),"ERROR MESSAGE.");