是无符号无符号长度的双倍总是双倍?

时间:2012-09-01 15:19:51

标签: objective-c c clang

unsigned long long i = 1000;

现在不应该0.1*i自动转换为双倍?当我将0.1*i传递给期望unsigned long long的函数参数时,为什么编译器不会警告我?我认为编译器应该警告这种潜在的精度损失。

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

2 个答案:

答案 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

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