निम्न कोड (छद्म- C ++) कोड को देखते हुए:
फ्लोट x = 100 , ए = 0.1; अहस्ताक्षरित int ऊंचाई = 63, चौड़ाई = 63; अहस्ताक्षरित int hw = 31; {इंट कॉल = 0; कोलेस्ट्रॉल; चौड़ाई; ++ कोला} {फ्लोट फू = एक्स + को - एचडब्लू + ए * (कॉल - एचडब्ल्यू) के लिए (इंट सोल = 0; पंक्ति और एलटी; ऊंचाई; ++ पंक्ति) ; Cout & lt; & lt; फू & लेफ्टिनेंट; & lt; ""; } Cout & lt; & lt; endl; }
फू के मानों को आधे हिस्से के लिए खराब कर दिया जाता है, उन स्थानों पर जहां (कर्नल - एचडब्ल्यू) ऋणात्मक है। मैंने सोचा क्योंकि कर्नल int है और पहले आता है, कि अभिव्यक्ति का यह भाग पूर्णांक में परिवर्तित हो जाता है और नकारात्मक हो जाता है। दुर्भाग्य से, जाहिरा तौर पर यह नहीं है, मुझे एक अहस्ताक्षरित मूल्य का अतिप्रवाह मिलता है और मुझे पता नहीं क्यों है।
मुझे इस समस्या का समाधान कैसे करना चाहिए? उपयोग पूरे या अभिव्यक्ति के भाग के लिए डाले? किस प्रकार का डाली (सी-स्टाइल या स्टेटिक_कास्ट & lt; ...>)? कब्र का उपयोग करने के लिए क्या कोई उपरि है (मुझे इसे तेजी से काम करने की ज़रूरत है!)?
संपादित करें: मैंने अपने सारे अहस्ताक्षरित इनट को नियमित रूप से बदल दिया है, लेकिन मैं अभी भी सोच रहा हूं कि मुझे इस स्थिति में इतना अतिप्रवाह क्यों मिला ।
अस्वाभाविक पूर्णांक अहस्ताक्षरित अंकगणित को लागू करता है। अनसाइन किए गए अंकगणितीय मॉड्यूलो अंकगणितीय हैं। सभी मान modulo 2 ^ एन समायोजित कर रहे हैं, जहां एन संवेखित प्रकार के मान प्रतिनिधित्व में बिट की संख्या है।
सरल शब्दों में, अहस्ताक्षरित अंकगणितीय हमेशा गैर नकारात्मक मूल्य पैदा करता है हर बार अभिव्यक्ति का नकारात्मक मान होना चाहिए, मान वास्तव में "लगभग चारों ओर लपेटता है" 2 ^ N और सकारात्मक बन जाता है
जब आप एक [सब-] अभिव्यक्ति में एक हस्ताक्षरित और एक अहस्ताक्षरित पूर्णांक मिश्रण करते हैं, तो अहस्ताक्षरित अंकगणित "जीत", यानी अहस्ताक्षरित डोमेन में गणना की जाती है। उदाहरण के लिए, जब आप col-hw
करते हैं, तो इसे (अहस्ताक्षरित) col-hw
के रूप में व्याख्या किया जाता है। इसका अर्थ है कि col == 0
और hs == 31
के लिए आपको परिणाम के रूप में -31
नहीं मिलेगा इसके बजाय आप UINT_MAX - 31 + 1
प्राप्त कर सकते हैं, जो सामान्य रूप से एक बहुत बड़ा सकारात्मक मूल्य है।
यह कहने के बाद, मुझे यह ध्यान रखना होगा कि मेरी राय में यह हमेशा एक अच्छा विचार है अहस्ताक्षरित प्रकार का उपयोग करने के लिए स्वाभाविक गैर-नकारात्मक मूल्यों का प्रतिनिधित्व करने के लिए वास्तव में, व्यवहार में अधिकतर (या कम से कम आधे) सी / सी ++ में पूर्णांक चर के साथ कार्यक्रम में अहस्ताक्षरित प्रकार होना चाहिए। आपके उदाहरण में अहस्ताक्षरित प्रकार का उपयोग करने का आपका प्रयास ठीक समझा गया है (अगर सही तरीके से इरादा समझता हो) इसके अलावा, मैं अहस्ताक्षरित
के लिए col
और पंक्ति
के रूप में भी इस्तेमाल करूँगा हालांकि, आपको अहस्ताक्षरित अंकगणितीय कामों को ध्यान में रखना होगा (जैसा ऊपर वर्णित है) और अपने व्यक्तित्व को तदनुसार लिखें। ज्यादातर समय, एक अभिव्यक्ति को फिर से लिखा जा सकता है ताकि यह अहस्ताक्षरित सीमा की सीमा को पार नहीं कर सके, अर्थात ज्यादातर समय पर हस्ताक्षर किए प्रकार पर कुछ भी स्पष्ट रूप से डालने की आवश्यकता नहीं है। अन्यथा, यदि आपको नकारात्मक मानों के साथ काम करने की आवश्यकता होती है, तो हस्ताक्षरित प्रकार के लिए एक अच्छी तरह से रखा डाली समस्या को हल करना चाहिए।
Comments
Post a Comment