unsigned long long i = 1000;
現在不應該將0.1*i
自動轉換成雙?那麼爲什麼編譯器會在我將0.1*i
傳遞給期望unsigned long long
的函數參數時發出警告?我認爲編譯器應該警告這種潛在的精度損失。是一個雙倍的無符號無符號長總是一個雙?
我的編譯器Clang配置了「-Weverything」向我顯示所有可能的警告。
unsigned long long i = 1000;
現在不應該將0.1*i
自動轉換成雙?那麼爲什麼編譯器會在我將0.1*i
傳遞給期望unsigned long long
的函數參數時發出警告?我認爲編譯器應該警告這種潛在的精度損失。是一個雙倍的無符號無符號長總是一個雙?
我的編譯器Clang配置了「-Weverything」向我顯示所有可能的警告。
是的,對一個整數和一個浮點數的運算會產生一個浮點數。但是當你將這個結果(這是一個double)傳遞給一個無符號long long的函數時,那麼將會有一個隱式強制轉換自動發生,結果將被截斷爲unsigned long long。
爲什麼你沒有收到警告?因爲就像GCC一樣,Clang's -Wall不會打開所有警告 - 您可以始終使用-Wextra來獲取所有警告。
因爲您可以將任何算術類型的值分配給任何算術類型的對象,並且標準不需要警告。
unsigned long long a = 0.1; // C does not require a warning
在上面的例子,0.1
在分配之前被轉換爲unsigned long long
。
將參數傳遞給其原型形式的函數時,參數將轉換爲參數類型,就像通過賦值一樣。
啊,好的。打開「可疑隱含轉換」警告標誌打開警告。我想知道爲什麼地獄「 - 萬物」不是它自稱的。這是我第二次遇到這種情況。它不包括所有警告:( – NoobOverflow