2015-01-18 17 views
55

मुझे पता है कि हस्ताक्षरित पूर्णांक केवल सकारात्मक संख्या (और 0) हैं, और सामान्य int की तुलना में मूल्य को दोगुना कर सकते हैं। वहाँ"हस्ताक्षरित" कीवर्ड का वास्तविक उपयोग क्या है?

int variable = 12; 

और के बीच कोई अंतर हैं:

signed int variable = 12; 

कब और क्यों तुम पर हस्ताक्षर किए कीवर्ड इस्तेमाल करना चाहिए?

+18

लगभग कभी नहीं। यह निहित है। एक संभावित अपवाद 'हस्ताक्षरित चार' है; मानक निर्दिष्ट नहीं करता है कि क्या सादा 'char' हस्ताक्षरित है या हस्ताक्षरित है, इसलिए यदि किसी कारण से आप विशेष रूप से एक हस्ताक्षरित चार चाहते हैं, तो आपको स्पष्ट रूप से कहना होगा। –

+2

मैं यह दिखाने के लिए इसका उपयोग करता हूं कि संख्या स्पष्ट रूप से हस्ताक्षरित है, पाठक को अनुस्मारक के अधिक। –

+5

@IgorTandetnik इससे भी अधिक, 'char',' पर हस्ताक्षर किए char' और 'अहस्ताक्षरित char' * तीन * अलग प्रकार के होते हैं। अन्य सभी अभिन्न प्रकारों के लिए, 'एक्स' और' हस्ताक्षरित एक्स' समान हैं। – Angew

उत्तर

89

केवल एक उदाहरण है जहां आप signed कीवर्ड का उपयोग करना चाह सकते हैं। signed char हमेशा "सादा" char से एक अलग प्रकार है, जो कार्यान्वयन के आधार पर एक हस्ताक्षरित या हस्ताक्षरित प्रकार हो सकता है।

सी ++ 14 3.9.1/1 का कहना है:

यह कार्यान्वयन से परिभाषित एक char वस्तु नकारात्मक मान हो सकते हैं या नहीं। अक्षरों को स्पष्ट रूप से unsigned या signed घोषित किया जा सकता है। सादा char, signed char, और unsigned char तीन अलग प्रकार [...]

अन्य संदर्भों में signed बेमानी है।


सी ++ 14, (और सी में) से पहले, दूसरा उदाहरण था: बिट-फ़ील्ड। यह कार्यान्वयन-परिभाषित किया गया था कि, उदाहरण के लिए, int x:2; (कक्षा की घोषणा में) unsigned int x:2; या signed int x:2 जैसा ही है।

सी ++ 11 9.6/3 ने कहा:

यह कार्यान्वयन परिभाषित किया गया है कि क्या एक सादे (न तो स्पष्ट रूप से हस्ताक्षर किए और न ही अहस्ताक्षरित) char, short, int, long, या long long सा मैदान हस्ताक्षरित किया गया है या अहस्ताक्षरित।

हालांकि, सी ++ 14 के बाद से इस ताकि int x:2; हमेशा signed int का मतलब बदल दिया गया है।Link to discussion

+4

और ध्यान दें कि ऐतिहासिक दृष्टि से, PowerPC- आधारित compilers '' char' डिफ़ॉल्ट रूप से unsigned' रूप में व्यवहार किया है, जबकि 86 और एआरएम 'signed' के रूप में यह इलाज किया है। – fluffy

+1

@fluffy: यदि 'char' 8 बिट्स है और स्रोत वर्ण सेट ईबीसीडीआईसी है, तो 'हस्ताक्षर' या 'हस्ताक्षरित' कीवर्ड की अनुपस्थिति में 'char' अनिवार्य होना चाहिए, क्योंकि ईबीसीडीआईसी अंकों 0-9 का प्रतिनिधित्व करता है कोड 0xF0 से 0xF9 और अंकों के साथ (साथ ही अक्षर और सी मानक में परिभाषित कोई विराम चिह्न) को सकारात्मक 'char' मानों द्वारा दर्शाया जाना चाहिए। बीटीडब्लू, मशीनों पर जहां 'char' और 'int' एक ही आकार के होते हैं,' char'' unsigned char 'के बराबर नहीं हो सकता है, क्योंकि 'int'' char' के सभी मानों को पकड़ने में सक्षम होना चाहिए, लेकिन' हस्ताक्षरित ' चार 'में पैडिंग नहीं हो सकती है। – supercat

+1

क्यों नवीनतम खींचे गए सी ++ 11, जैसे कि एन 36 9 0/एन 37 9 7 में, कथन नहीं है: "यह क्रियान्वयन-परिभाषित है कि एक सादा (न तो स्पष्ट रूप से हस्ताक्षरित और न ही हस्ताक्षरित) चार, लघु, int, लंबा, या लंबे समय तक थोड़ा सा -फील्ड हस्ताक्षरित या हस्ताक्षरित है "। क्या यह बदल गया है? – pezy

8

int के मामले में, वहाँ कोई अंतर नहीं है। यह केवल क्योंकि

  1. यह परिभाषित नहीं है कि क्या char पर हस्ताक्षर किए या अहस्ताक्षरित है, और
  2. char, signed char, और unsigned char तीन अलग प्रकार के वैसे भी कर रहे हैं char के साथ एक फर्क नहीं पड़ता।

तो तुम signed का उपयोग करना चाहिए अगर आप एक signed char जरूरत है (जो शायद कम ही है)। इसके अलावा, मैं किसी कारण के बारे में नहीं सोच सकता।

+0

चार के बारे में अच्छी बात है, और ईमानदार होना, compilers (विशेष रूप से DevStudio) आप क्या डिफ़ॉल्ट चार – hvanbrug

+0

@hvanbrug के लिए है स्पष्ट करने देते हैं: मुझे लगता है कि "उल्लेखनीय" है नहीं लगता। उल्लेखनीय है कि जीसीसी के पास ऐसा विकल्प है। –

+2

कंपाइलर स्नोबबेरी को छोड़कर मैंने अभी devstudio का उल्लेख किया क्योंकि मुझे यकीन था कि यह किया था। मैं जीसीसी के बारे में निश्चित नहीं था इसलिए मैंने इसका जिक्र नहीं किया। इसके अलावा, जीसीसी देव स्टूडियो से अधिक उल्लेखनीय नहीं है। जब आप मानते हैं कि विंडोज़ में अब तक दुनिया का सबसे बड़ा इंस्टॉल बेस है, तो देव स्टूडियो को देखना आसान है, और इस तरह के दृश्य सी ++ में बहुत सारे उपयोगकर्ता हैं (जैसा कि जीसीसी करता है)। उस ने कहा, शायद "सहित" शब्द मेरे बिंदु को "विशेष रूप से" से बेहतर तरीके से लाएगा। – hvanbrug

0

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

+1

"आप फ़ॉर्मेटिंग के लिए ... शामिल कर सकते हैं" कोड में कुछ जोड़ने का वास्तव में खराब कारण है। सबसे पहले, लोगों को अपना कोड सरल बनाने का प्रयास करना चाहिए, और अनावश्यक अव्यवस्था से परहेज करना कोड को सरल बनाता है। – cmaster

+1

आपकी राय @cmaster के लिए धन्यवाद। मेरी राय स्वरूपण में एक बहुत ही महत्वपूर्ण विषय है। मेरे 30+ प्रोग्रामिंग प्रोग्राम में मैंने और गलतियों को देखा है क्योंकि डेवलपर कोड नहीं पढ़ सका और इसलिए अर्थ को गलत समझा। यह हमेशा सुनिश्चित करें कि उनके कोड पठनीय है बनाने के लिए एक प्रोग्रामर मन में होना चाहिए क्योंकि आप केवल एक इसे देख नहीं हो सकता है, और उस बात के लिए, कुछ ही वर्षों में या तो आप अपने खुद के कोड को नहीं पहचान सकता। – hvanbrug

+0

@cmaster मुझे लगता है कि आप चेरी को डाउनवोट के कारण के लिए चुनते हैं। पूरी तरह से उसका जवाब पढ़ें। –

4

signed डिफ़ॉल्ट पूर्णांक प्रकार है। तो नहीं, आपके द्वारा दिए गए उदाहरण में कोई अंतर नहीं है। char के मामले में केवल एक अंतर है।

स्रोत: C++ Reference

संबंधित मुद्दे