缩小从无符号到双倍的转换

fre*_*low 32 c++ double warnings type-conversion c++11

static_assert(sizeof(unsigned) == 4, ":(");
static_assert(sizeof(double) == 8 ,":(");
unsigned u{42};
double x{u};
Run Code Online (Sandbox Code Playgroud)

g ++ 4.7.1抱怨这段代码:

warning: narrowing conversion of 'u' from 'unsigned int' to 'double' inside { }
Run Code Online (Sandbox Code Playgroud)

为什么这是一个缩小的转换?是不是每个人都能unsigned完美代表double

Mik*_*our 37

为什么这是一个缩小的转换?

因为定义包括(以我的重点):

C++ 11 8.5.4/7收缩转换是从一个整数类型的隐式转换[...] [...]对浮点型,除非源是一个常量表达式和之后的实际值转换将适合目标类型,并在转换回原始类型时生成原始值.

u 不是常量表达式,因此无论源类型的所有可能值是否都可以在目标类型中表示,它都是一个缩小的转换.

是不是每个人都能unsigned完美代表double

这是实施的定义.在32位unsigneddouble52位尾数的常见情况下,就是这种情况; 但是一些实现具有更大unsigned和/或更小的double表示,因此依赖于该假设的代码是不可移植的.

  • 最可笑的是,连`char x='3'; double y{x};` 也是一个缩小转换错误。从“char”到“double”的转换是缩小转换! (3认同)