सी में, int
की तुलना में अधिक प्रकार के अभिव्यक्तियों में मूल्यों की गणना गणना से पहले व्यापक प्रकार में प्रचारित की जाती है। यदि int
संकुचित प्रकार के सभी मानों को पकड़ने के लिए पर्याप्त है, तो इसे int
पर प्रचारित किया जाता है; अन्यथा इसे unsigned int
पर प्रचारित किया जाता है।
इस मामले में, int
तो अपने मूल्यों int
करने के लिए प्रोत्साहित कर रहे हैं, काफी चौड़ा अपने unsigned char
के सभी मानों धारण करने के लिए है।
pktNum
(और इस प्रकार, प्रचारित pktNum
) में 0 और 255 समावेशी के बीच मूल्य हो सकता है। यह वह मान है जिसका उपयोग !=
ऑपरेटर के बाईं ओर किया जाएगा।
invPktNum
इसी प्रकार 0 और 255 समावेशी के बीच एक मूल्य हो सकता है। यह मान int
पर प्रचारित किया जाएगा, और फिर bitwise-negated। इस बिटवाईयर अस्वीकृति का नतीजा हमेशा नकारात्मक नंबर होगा, क्योंकि साइन बिट को अस्वीकार कर दिया जाएगा। यह वह मान है जिसका उपयोग !=
ऑपरेटर के दाईं ओर किया जाएगा।
कोई नकारात्मक संख्या कभी भी प्रचारित pktNum
के बराबर नहीं हो सकती है, इसलिए स्थिति हमेशा सत्य होती है।
गणना कि आप वास्तव में करने के लिए, आप निषेध के बाद कम आठ बिट बाहर मुखौटा करने की जरूरत है चाहता हूँ करने के लिए:
if (pktNum != (~invPktNum & 0xff)) {
return 1;
}
या वैकल्पिक रूप से, आप बस बिट्स में आपकी रुचि है नकारना कर सकते हैं:
if (pktNum != (invPktNum^0xff)) {
return 1;
}
आह, यह था - और मैंने कुछ नया सीखा है। आपके अद्भुत विस्तृत उत्तर के लिए धन्यवाद! – Justin
@ FallSe7en: डी-कोडिंग डीबगिंग की अद्भुत भ्रमित दुनिया में आपका स्वागत है। संकलक चेतावनी के बिना उस बग को खोजने की कोशिश कीजिए! –