出現這個警告該如何處理,求指點

uj5u.com熱心網友回復:
Warning C26451uj5u.com熱心網友回復:
short int si;int i;
i=(int)si+10000;
uj5u.com熱心網友回復:
警告的內容是讓你用4位元組存盤的資料改成8位元組存盤,因為已經溢位了。貼代碼吧,或許更好的解決問題~uj5u.com熱心網友回復:
不得了,趙4老濕終于回來了。大家快來看吶,別讓他跑了!
short int si;
int i;
i = (int) si + 10000;
嘻,趙老濕你是認真的嗎? 變數 si 沒有初始化或者賦值,而且,10000 是一個整型常量,它的型別是 int。在做這個加法運算時, 要對變數 si 的值做整型提升。提升之后,兩個運算元的型別相同,不再進一步轉換,直接做加法。
當然,趙老濕說這我知道,我只是做一個例子來說明,不要在意這些細節。不過我有一個更好的例子:
char c;
int i = 50;
c = i + 60ULL;
趙老濕你看,這個例子多明顯吶。唉,不過樓主的資訊不完整,人家寫的也許并不是 C 語言程式。
uj5u.com熱心網友回復:
for (int j = 0; j < 20; ++j)
{
if (d[i] == j)
{
k[i] = j;
break;
}
else if (d[i] > j && d[i] < j + 1) //其中陣列d為double在j+1處有誤
{
k[i] = j + 1;
break;
}
}
uj5u.com熱心網友回復:
是C語言程式
uj5u.com熱心網友回復:
Warning C26451
有看過,有點無從下手
uj5u.com熱心網友回復:
出現這個警告該如何處理,求指點
for (int j = 0; j < 20; ++j)
{
if (d[i] == j)
{
k[i] = j;
break;
}
else if (d[i] > j && d[i] < j + 1) //其中陣列d為double在j+1處有誤
{
k[i] = j + 1;
break;
}
}
窩哈哈哈,原來如此。趙4老濕將會告訴你,對于運算式 d [i] < j + 1 來說,依據常規算術轉換(Usual arithmetic conversions)的規則,要先計算子運算式 d [i] 和 j + 1 的值,再將這兩個值轉換為相同的型別,然后進行比較。
子運算式 d [i] 的結果型別是 double,先按下不表;
在子運算式 j + 1 中,子運算式 j 的型別是 int ,常量 1 的型別也是 int,相加后的結果型別是 int。
如此一來,需要將子運算式 j + 1 的結果從它原來的 int 型別轉換為 double 型別。
但是,在計算子運算式 j + 1 的時候,如果 j 的值是 int 型別的最大值,則這個計算可能會溢位。在這種情況下,編譯器就可能會傾向于認為,既然運算式 j + 1 的結果遲早要轉換為 double ,那么,何不將 j 或者 1 提前轉換為 double 呢?這樣就可以避免溢位。例如:
d [i] < (double) j + 1;
或者
d [i] < j + 1.0;
不管是采用哪一種方式,對于加法運算來說,也是先進行常規算術轉換,將兩個運算元都轉換為 double 型別,于是相加的結果自然是不會溢位的、double 型別的值。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/284383.html
標籤:C語言
