2012-05-08 126 views
0
int i=9999; 

char c=i; 

沒有給出溢出警告,雖然爲什麼沒有溢出警告當轉換INT爲char

char c=9999; 

給人,

警告C4305初始化截斷從int到char

爲什麼在將int轉換爲時沒有溢出警告?

+3

@pmg:不,它們都是初始化。 –

+0

你是對的@KeithThompson,謝謝。我刪除了錯誤的評論。 – pmg

+0

@pmg你的評論讓我感到困惑,所以我不得不在另外一個問題中發表它。這就是你所說的 - 「這不是一回事。第一個是賦值,第二個是初始化。這裏是鏈接http:// stackoverflow。com/questions/16500028/how-is-int-i-999-char-c-i-different-from-char-c-999 –

回答

9

使用/ W4進行編譯時,您將得到warning C4244(您應該使用總是)。

警告C4244:初始化':從「int」轉換到「char」,可能丟失數據

+0

:(我忘了啓用最高警告 謝謝 – Vince

+0

請注意,該警告沒有考慮到'i'的值恰好是'9999'這一事實,編譯器可能會對' int i = 42; char c = i;' –

1

無論任何代碼構造產生警告要由編譯器的聰明以及作者的選擇。

char c=9999; 

9999是一個常量表達式。編譯器可以通過分析沒有附加上下文的聲明來確定它會溢出。 (據推測平原char簽署;如果是無符號的轉換是明確的 - 但是編譯器仍然可以選擇警告一下吧。)

int i=9999; 

char c=i; 

這有相同的語義,但對於一個編譯器警告在初始化c時,它必須知道i在分析該聲明時的值爲9999(或至少在char範圍之外的值)。假設你寫道:

int i = 9999; 
i = 42; 
char c = i; 

然後顯然沒有警告是必要的或適當的。

由於James McNellis's answer表示,如果一個足夠聰明的編譯器可以警告任何情況下,如果它執行程序執行過程中會發生什麼事情的附加分析。對於某些編譯器來說,它有助於啓用優化,因爲優化代碼所需的分析(不會破壞代碼)也可以揭示這種潛在的運行時錯誤。

我會注意到,這是你問的問題的答案:爲什麼沒有警告。您接受的答案是隱含問題:「我想這裏有警告;我該如何啓用它?」。我不是在抱怨,只是在觀察。

+0

+1。** pmg **也承認關於一個是初始化的意見,另一個是一個任務是錯誤的。現在整個事情都非常清楚了。感謝時間吧拿出了2個很好的答案。 –