我最近刚刚注意到框架中的一些代码,将某些变量转换为双精度,然后在框架访问它们时转换回来。在C++11标准中,这能保证在不损失任何整数类型的精度的情况下工作吗?如果是,是哪一个?在常见的实现中,有没有其他类型对这种类型的转换是普遍安全的?
另外,有没有办法在编译时以这种方式检查转换是安全的?从本质上讲,我喜欢这样的东西:
static_assert(T(double(T type))==type);发布于 2016-08-21 07:09:34
当整型T的值域是double型精确整数值值域的子域时,T(double(T_value))==T_value是有保证的。
由于没有double的实现具有16位或更少的尾数,而且据我所知没有任何现有的C++实现具有超过16位的每字节(来自<limits.h>的CHAR_BIT常量),因此这一保证适用于char和显式signed和unsigned变体。
通常,double有一些50+位的尾数,这足以保证32位整型类型也成立,但不是64位。
发布于 2016-08-21 08:34:46
好吧,我(基本上)弄明白了我问题的第二部分:
#include <limits>
static_assert(T(double(std::numeric_limits<T>::max()))==std::numeric_limits::max(),"ERROR MESSAGE.");https://stackoverflow.com/questions/39058979
复制相似问题