हस्ताक्षर किए गए से अधिक अहस्ताक्षरित मानों का उपयोग कब करें?


82

किसी हस्ताक्षरित से अधिक एक अहस्ताक्षरित चर का उपयोग करना कब उचित है? एक forपाश में क्या ?

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

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

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


1
मुझे यह मददगार लगा: codemines.blogspot.ca/2007/10/…
mk12

मुझे लगता है कि यह सवाल काफी राय आधारित है। प्रस्तुत कोड दोनों मामलों में ठीक चलेगा, इसलिए आप दोनों का उपयोग कर सकते हैं। प्रदर्शन कारणों को छोड़कर (कोई जवाब वास्तव में अब तक प्रदर्शन से संबंधित नहीं है) यह सिर्फ व्यक्तिगत स्वाद है।
ट्रिलियनियन

जवाबों:


69

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

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

यदि आप मास्क जैसी कड़वी चीजें करने जा रहे हैं, तो अहस्ताक्षरित अधिक समझ में आने लगता है। या, यदि आप साइन बिट का लाभ उठाकर उस अतिरिक्त सकारात्मक सीमा को पाने के लिए बेताब हैं।

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


3
बाद में उस धागे में, यह दिखाया गया है कि unsignedअविश्वसनीय इनपुट में अतिप्रवाह का पता लगाने के लिए यह बहुत बेहतर है। दुर्भाग्य से, पहेली के लिए प्रस्तावित "उत्तर" वह सब महान नहीं हैं। मेरा है template<size_t limit> bool range_check_sum( unsigned a, unsigned b ) { return (a < limit) && (b < limit - a); } अगर किसी के पास हस्ताक्षरित प्रकारों का उपयोग करके एक समान और सरल उत्तर है, तो मैं इसे देखना पसंद करूंगा।
बेन वोइग्ट

10

ऊपर आपके उदाहरण में, जब 'i' हमेशा सकारात्मक होगा और एक उच्च श्रेणी लाभकारी होगी, अहस्ताक्षरित उपयोगी होगी। जैसे यदि आप 'डिक्लेयर' स्टेटमेंट का उपयोग कर रहे हैं, जैसे:

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

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

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

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


9

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

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


8

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

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

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

हस्ताक्षरित संख्याओं का उपयोग करने के साथ नकारात्मक पक्ष यह है कि उन्हें अधिभार के लिए एक प्रलोभन है ताकि, उदाहरण के लिए, मान 0-> n मेनू चयन हो, और -1 का मतलब कुछ भी चयनित नहीं है - एक वर्ग बनाने के बजाय जिसमें दो चर हैं, एक से इंगित करें कि क्या कुछ चुना गया है और दूसरा उस संग्रह को संग्रहीत करने के लिए जो चयन है। इससे पहले कि आप यह जानते हैं, आप सभी जगह नकारात्मक एक के लिए परीक्षण कर रहे हैं और संकलक शिकायत कर रहे हैं कि आप मेनू चयन की तुलना में मेनू चयन की तुलना आपके द्वारा कैसे करना चाहते हैं - लेकिन यह खतरनाक है क्योंकि वे विभिन्न प्रकार हैं । तो ऐसा मत करो।


6

size_tअक्सर इसके लिए एक अच्छा विकल्प है, या size_typeयदि आप एसटीएल वर्ग का उपयोग कर रहे हैं।


केवल तब जब आप बाइट्स में किसी चीज़ के आकार के साथ काम कर रहे हों।
एमके 12

@ mk12 स्टैंडर्ड लाइब्रेरी कंटेनर एक्सपोज करते हैं size_type केवल बाइट्स के लिए तत्वों की गिनती के लिए सदस्य को । std::size_tजहाँ उपलब्ध हो, उसके बजाय इसका उपयोग किया जाना चाहिए , लेकिन यह गलत है कि कुछ भी शुरू करने का अर्थ size_tकेवल बाइट्स हो सकता है।
अंडरस्कोर_ड
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.