[英]narrowing conversion from unsigned to double
static_assert(sizeof(unsigned) == 4, ":(");
static_assert(sizeof(double) == 8 ,":(");
unsigned u{42};
double x{u};
g ++ 4.7.1抱怨以下代码:
warning: narrowing conversion of 'u' from 'unsigned int' to 'double' inside { }
为什么这会缩小转换范围? 难道不是每个unsigned
完美地表示为double
吗?
为什么这会缩小转换范围?
因为定义包括(我强调):
C ++ 11 8.5.4 / 7 缩小转换是从整数类型到浮点类型的隐式转换, 除非源是常量表达式且实际值在...之后。转换将适合目标类型,并在转换回原始类型时将产生原始值。
u
不是常数表达式,因此无论源类型的所有可能值是否都可以在目标类型中表示,这是一个缩小的转换。
难道不是每个
unsigned
完美地表示为double
吗?
那是实现的定义。 在32位unsigned
和52位尾数double
的常见情况下,情况就是这样。 但是某些实现具有较大的unsigned
和/或较小的double
表示形式,因此依赖于此假设的代码不可移植。
警告,因为您使用非恒定表达式初始化x
Ilyas-iMac:TestC++11 sandye51$ cat main.cpp
int main()
{
static_assert(sizeof(unsigned) == 4, ":(");
static_assert(sizeof(double) == 8 ,":(");
constexpr unsigned u{42};
double x{u};
return 0;
}Ilyas-iMac:TestC++11 sandye51$ gcc -o main main.cpp -std=c++11
Ilyas-iMac:TestC++11 sandye51$
如您所见,上面的代码可以正常工作,没有任何警告或错误
(让我们尝试一下:) double
正好有52位有效(二进制)数字位(根据ieee标准),而unsigned int
在某些其他系统上可能有64位。 因此,此系统上实际unsigned int
的宽度可能没有任何价值。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.