unsigned long long i = 1000;
现在不0.1*i
应该自动转换成双精度数吗?为什么当我传入0.1*i
一个需要 的函数参数时编译器没有警告我unsigned long long
?我认为编译器应该警告这种潜在的精度损失。
我的编译器 Clang 配置了“-Weverything”来显示所有可能的警告。
unsigned long long i = 1000;
现在不0.1*i
应该自动转换成双精度数吗?为什么当我传入0.1*i
一个需要 的函数参数时编译器没有警告我unsigned long long
?我认为编译器应该警告这种潜在的精度损失。
我的编译器 Clang 配置了“-Weverything”来显示所有可能的警告。
是的,对整数和浮点数的运算会产生浮点数。但是,当您将该结果(这是一个双精度数)传递给一个期望 unsigned long long 的函数时,将会自动进行隐式转换,结果将被截断为 unsigned long long。
为什么没有收到警告?因为就像 GCC 一样,Clang 的 -Wall 不会打开所有警告 - 您始终可以使用 -Wextra 来获取所有警告。
因为您可以将任何算术类型的值分配给任何算术类型的对象,并且标准不需要为此发出警告。
unsigned long long a = 0.1; // C does not require a warning
在上面的例子中,0.1
被转换为unsigned long long
之前的赋值。
并且当以原型形式将参数传递给函数时,参数被转换为参数类型,就像通过赋值一样。