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

Noo*_*low 3 c objective-c clang

unsigned long long i = 1000;
Run Code Online (Sandbox Code Playgroud)

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

我有我的编译器,Clang,配置"-Weverything"向我展示所有可能的警告.

小智 6

是的,对整数和浮点数的操作会产生浮点数.但是当你将结果(这是一个双精度数)传递给一个期望无符号long long的函数时,就会自动发生隐式转换,结果将被截断为unsigned long long.

你为什么不收到警告?因为就像GCC一样,Clang的-Wall没有打开所有警告 - 你总是可以使用-Wextra来获得真正的所有警告.

  • 喔好吧.打开"可疑隐式转换"警告标志会打开警告.我想知道为什么地狱" - 我们的一切"不是它声称的那样.这是我第二次遇到这种情况.它不包括所有警告:( (2认同)