मैं अपने कोड और उसके इरादे को और अधिक स्पष्ट करने के लिए अहस्ताक्षरित ints का उपयोग करता हूं। जब मैं हस्ताक्षरित और अहस्ताक्षरित दोनों प्रकार के साथ अंकगणित कर रहा होता हूं, तो एक अप्रत्याशित निहितार्थ से बचाव के लिए मैं अपने अहस्ताक्षरित चर के लिए अहस्ताक्षरित लघु (2 बाइट्स) का उपयोग करता हूं। यह कुछ कारणों से प्रभावी है:
- जब आप अपने अहस्ताक्षरित लघु चर और शाब्दिक (जो प्रकार int के होते हैं) या प्रकार int के चर के साथ अंकगणित करते हैं, तो यह सुनिश्चित करता है कि अभिव्यक्ति का मूल्यांकन करने से पहले अहस्ताक्षरित चर को हमेशा बढ़ावा दिया जाएगा, क्योंकि int की हमेशा शॉर्ट से उच्च रैंक होती है । यह हस्ताक्षरित और अहस्ताक्षरित प्रकारों के साथ अंकगणित करने वाले किसी भी अप्रत्याशित व्यवहार से बचा जाता है, यह मानते हुए कि अभिव्यक्ति का परिणाम एक हस्ताक्षरित पाठ्यक्रम में फिट बैठता है।
- अधिकांश समय, आपके द्वारा उपयोग किया जा रहा अहस्ताक्षरित 2-बाइट शॉर्ट (65,535) के अधिकतम मान से अधिक नहीं होगा
सामान्य सिद्धांत यह है कि आपके अहस्ताक्षरित चर का प्रकार हस्ताक्षरित प्रकार को बढ़ावा देने के लिए हस्ताक्षरित चर के प्रकार से कम रैंक होना चाहिए। तब आपके पास कोई अप्रत्याशित अतिप्रवाह व्यवहार नहीं होगा। जाहिर है आप इसे हर समय सुनिश्चित नहीं कर सकते, लेकिन (अधिकतर) अक्सर यह सुनिश्चित करने के लिए संभव है।
उदाहरण के लिए, हाल ही में मैंने लूप के लिए कुछ इस तरह से किया था:
const unsigned short cuint = 5;
for(unsigned short i=0; i<10; ++i)
{
if((i-2)%cuint == 0)
{
//Do something
}
}
शाब्दिक '2' टाइप इंट का है। यदि मैं एक अहस्ताक्षरित लघु के बजाय एक अहस्ताक्षरित int था, तो उप-अभिव्यक्ति (i-2) में, 2 को एक अहस्ताक्षरित int में पदोन्नत किया जाएगा (चूंकि अहस्ताक्षरित int के पास हस्ताक्षरित int की तुलना में उच्च प्राथमिकता है)। यदि मैं = 0 है, तो उप-अभिव्यक्ति बराबर (0u-2u) = अतिप्रवाह के कारण कुछ बड़े मूल्य। I = 1 के साथ एक ही विचार। हालांकि, चूंकि मैं एक अहस्ताक्षरित छोटा है, इसलिए इसे उसी प्रकार प्रचारित किया जाता है जैसे कि शाब्दिक '2', जिसे इंट साइन किया गया है, और सब कुछ ठीक काम करता है।
अतिरिक्त सुरक्षा के लिए: उस दुर्लभ मामले में जहां आप जिस आर्किटेक्चर को लागू कर रहे हैं वह int 2 बाइट्स होने का कारण बनता है, इससे अंकगणितीय अभिव्यक्ति में दोनों ऑपरेंड का कारण उस मामले में अहस्ताक्षरित int को बढ़ावा दिया जा सकता है जहां अहस्ताक्षरित लघु चर फिट नहीं होता है हस्ताक्षरित 2-बाइट इंट में, जिसके बाद का अधिकतम मूल्य 32,767 <65,535 है। ( अधिक जानकारी के लिए https://stackoverflow.com/questions/17832815/c-implicit-conversion-signed-unsign देखें )। इसके विरुद्ध पहरा देने के लिए आप अपने प्रोग्राम में static_assert को इस प्रकार जोड़ सकते हैं:
static_assert(sizeof(int) == 4, "int must be 4 bytes");
और यह उन आर्किटेक्चर पर संकलन नहीं करेगा जहां int 2 बाइट्स है।
for(unsigned int n = 10; n >= 0; n --)
(छोरों अनंत)