繁体   English   中英

从无符号转换为双精度

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM