3
unsigned long long i = 1000;

现在不0.1*i应该自动转换成双精度数吗?为什么当我传入0.1*i一个需要 的函数参数时编译器没有警告我unsigned long long?我认为编译器应该警告这种潜在的精度损失。

我的编译器 Clang 配置了“-Weverything”来显示所有可能的警告。

4

2 回答 2

6

是的,对整数和浮点数的运算会产生浮点数。但是,当您将该结果(这是一个双精度数)传递给一个期望 unsigned long long 的函数时,将会自动进行隐式转换,结果将被截断为 unsigned long long。

为什么没有收到警告?因为就像 GCC 一样,Clang 的 -Wall 不会打开所有警告 - 您始终可以使用 -Wextra 来获取所有警告。

于 2012-09-01T15:23:02.587 回答
4

因为您可以将任何算术类型的值分配给任何算术类型的对象,并且标准不需要为此发出警告。

unsigned long long a = 0.1;  // C does not require a warning

在上面的例子中,0.1被转换为unsigned long long之前的赋值。

并且当以原型形式将参数传递给函数时,参数被转换为参数类型,就像通过赋值一样。

于 2012-09-01T15:21:21.050 回答