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