हस्ताक्षरित लोगों पर हस्ताक्षरित मूल्यों का उपयोग कब करें?

एक हस्ताक्षरित एक पर हस्ताक्षर किए गए चर का उपयोग करना कब उचित है? एक के लिए लूप में क्या है?

मैं इसके बारे में बहुत सारी राय सुनता हूं और मैं देखना चाहता हूं कि सर्वसम्मति से कुछ ऐसा था या नहीं।

for (unsigned int i = 0; i < someThing.length(); i++) {  
    SomeThing var = someThing.at(i);  
    // You get the idea.  
}

मुझे पता है कि जावा के पास हस्ताक्षर किए गए मान नहीं हैं, और यह सूर्य माइक्रोसिस्टम्स पर एक कल्पित निर्णय होना चाहिए था ' अंश।

0
जोड़ा संपादित
विचारों: 1
मुझे यह सहायक मिला: codemines.blogspot.ca/2007/10 / & hellip;
जोड़ा लेखक mk12, स्रोत
मुझे लगता है कि यह सवाल काफी राय आधारित है। प्रस्तुत कोड दोनों मामलों में ठीक होगा, इसलिए आप दोनों का उपयोग कर सकते हैं। प्रदर्शन कारणों को छोड़कर (वास्तव में कोई जवाब वास्तव में प्रदर्शन के साथ सौदा नहीं करता है) यह सिर्फ व्यक्तिगत स्वाद है।
जोड़ा लेखक Trilarion, स्रोत

5 उत्तर

मुझे एक अच्छी बातचीत इस विषय पर, जैसा कि मैंने वास्तव में इसे पहले बहुत सोचा नहीं था।

संक्षेप में, हस्ताक्षरित एक अच्छी सामान्य पसंद है - भले ही आप मर चुके हों, फिर भी सभी संख्याएं सकारात्मक हैं - यदि आप परिवर्तनीय पर अंकगणित करने जा रहे हैं (जैसे कि लूप केस के लिए सामान्य में)।

यदि आप मास्क जैसे बिटवाई चीजों को करने जा रहे हैं, तो बिना हस्ताक्षर करने के लिए हस्ताक्षरित शुरू होता है। या, यदि आप साइन बिट का लाभ उठाकर उस अतिरिक्त सकारात्मक सीमा को पाने के लिए बेताब हैं।

निजी तौर पर, मुझे हस्ताक्षर करना पसंद है क्योंकि मैं लगातार रहने के लिए खुद पर भरोसा नहीं करता हूं और दो प्रकारों को मिश्रण करने से बचता हूं (जैसे लेख चेतावनी देता है)।

0
जोड़ा
बाद में उस धागे में, यह दिखाया गया है कि अविश्वसनीय इनपुट में ओवरफ़्लो का पता लगाने के लिए unsigned बहुत बेहतर है। दुर्भाग्यवश, पहेली के लिए प्रस्तावित "उत्तर" सभी महान नहीं हैं। मेरा टेम्पलेट bool range_check_sum (हस्ताक्षरित ए, हस्ताक्षरित बी) {वापसी (एक <�सीमा) && (बी <�सीमा - ए) है; } अगर किसी के पास हस्ताक्षरित प्रकारों का उपयोग करके एक समान सरल और सीधा जवाब है, तो मुझे इसे देखना अच्छा लगेगा।
जोड़ा लेखक Ben Voigt, स्रोत

size_t is often a good choice for this, or size_type if you're using an STL class.

0
जोड़ा
केवल तभी जब आप बाइट्स में किसी चीज़ के आकार से निपट रहे हों।
जोड़ा लेखक mk12, स्रोत

उपरोक्त आपके उदाहरण में, जब 'मैं' हमेशा सकारात्मक होगा और उच्च श्रेणी लाभकारी होगी, हस्ताक्षरित उपयोगी होगा। जैसे कि आप 'घोषणा' कथन का उपयोग कर रहे हैं, जैसे कि:

#declare BIT1 (unsigned int 1)
#declare BIT32 (unsigned int reallybignumber)

खासकर जब ये मान कभी नहीं बदलेंगे।

हालांकि, यदि आप एक लेखा कार्यक्रम कर रहे हैं जहां लोग अपने पैसे के साथ गैर जिम्मेदार हैं और लगातार लाल रंग में हैं, तो आप निश्चित रूप से 'हस्ताक्षरित' का उपयोग करना चाहेंगे।

मैं संत से सहमत हूं हालांकि अंगूठे का एक अच्छा नियम हस्ताक्षर का उपयोग करना है, जो सी वास्तव में डिफ़ॉल्ट है, इसलिए आप कवर हैं।

0
जोड़ा

जब आप हस्ताक्षरित और हस्ताक्षरित प्रकारों की तुलना करते हैं तो सी और सी ++ कंपाइलर्स चेतावनी उत्पन्न करेंगे; अपने उदाहरण कोड में, आप अपने लूप वैरिएबल को हस्ताक्षरित नहीं कर पाएंगे और संकलक के बिना संकलक कोड उत्पन्न कर सकते हैं (माना जाता है कि चेतावनियां चालू थीं)।

स्वाभाविक रूप से, आप चेतावनियों के साथ संकलन कर रहे हैं सभी तरह से बदल गया, है ना?

और, क्या आपने इसे एक कदम आगे बढ़ाने के लिए "चेतावनियों के रूप में चेतावनियों के रूप में व्यवहार" के साथ संकलित माना है?

The downside with using signed numbers is that there's a temptation to overload them so that, for example, the values 0->n are the menu selection, and -1 means nothing's selected - rather than creating a class that has two variables, one to indicate if something is selected and another to store what that selection is. Before you know it, you're testing for negative one all over the place and the compiler is complaining about how you're wanting to compare the menu selection against the number of menu selections you have - but that's dangerous because they're different types. So don't do that.

0
जोड़ा

मुझे लगता है कि यदि आपका व्यवसाय मामला यह निर्देश देता है कि ऋणात्मक संख्या अमान्य है, तो आप इच्छित को दिखाए गए या फेंकने में त्रुटि होगी।

इस बात को ध्यान में रखते हुए, मैंने हाल ही में एक बाइनरी फ़ाइल में प्रोजेक्ट प्रोसेसिंग डेटा पर काम करते हुए और डाटाबेस में डेटा संग्रहीत करते समय हाल ही में हस्ताक्षरित पूर्णांक के बारे में पता लगाया। मैं जानबूझकर बाइनरी डेटा को "दूषित" कर रहा था, और अपेक्षित त्रुटि के बजाय नकारात्मक मान प्राप्त कर रहा था। मैंने पाया कि मूल्य परिवर्तित होने के बावजूद, मूल्य मेरे व्यावसायिक मामले के लिए मान्य नहीं था।
मेरा प्रोग्राम गलती नहीं हुई, और मुझे डेटाबेस में गलत डेटा मिल गया। अगर मैंने uint का उपयोग किया था और प्रोग्राम विफल हो गया तो यह बेहतर होगा।

0
जोड़ा