2012-09-01 82 views
3
unsigned long long i = 1000; 

現在不應該將0.1*i自動轉換成雙?那麼爲什麼編譯器會在我將0.1*i傳遞給期望unsigned long long的函數參數時發出警告?我認爲編譯器應該警告這種潛在的精度損失。是一個雙倍的無符號無符號長總是一個雙?

我的編譯器Clang配置了「-Weverything」向我顯示所有可能的警告。

回答

6

是的,對一個整數和一個浮點數的運算會產生一個浮點數。但是當你將這個結果(這是一個double)傳遞給一個無符號long long的函數時,那麼將會有一個隱式強制轉換自動發生,結果將被截斷爲unsigned long long。

爲什麼你沒有收到警告?因爲就像GCC一樣,Clang's -Wall不會打開所有警告 - 您可以始終使用-Wextra來獲取所有警告。

+2

啊,好的。打開「可疑隱含轉換」警告標誌打開警告。我想知道爲什麼地獄「 - 萬物」不是它自稱的。這是我第二次遇到這種情況。它不包括所有警告:( – NoobOverflow

4

因爲您可以將任何算術類型的值分配給任何算術類型的對象,並且標準不需要警告。

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

在上面的例子,0.1在分配之前被轉換爲unsigned long long

將參數傳遞給其原型形式的函數時,參數將轉換爲參數類型,就像通過賦值一樣。

相關問題