2012-03-30 9 views
15

कोड का टुकड़ा में अहस्ताक्षरित है:चेतावनी: इस दशमलव निरंतर केवल आईएसओ C90

long rangeVar = 0; 
rangeVar = atol(p_value); 

if (rangeVar >= -2147483648 && rangeVar <= 2147483647) 

मैं संकलन पर मिलती है:

चेतावनी: इस दशमलव निरंतर केवल आईएसओ C90 में

अहस्ताक्षरित है

अग्रिम में धन्यवाद

+1

C90 'लंबे long' प्रकार है, जो कारण है कि यह C99 की तुलना में अलग तरह की संख्या संभालती है नहीं है। – Lindydancer

+2

एफवाईआई: सही उत्तर यहां पाया गया है: http://stackoverflow.com/questions/2347936/cant-get-rid-of-this-decimal-constant-is-unsigned-only-in-iso-c90- चेतावनी – natersoz

उत्तर

9

हां, यह एक चीज है जिसे बहुत अच्छी तरह से संभाला नहीं जाता है संकलक। समस्या यह है कि संकलन के दौरान, यह संख्या 2147483648 है जिसे अस्वीकार कर दिया गया है, और 2147483648 एक पूर्णांक के लिए सीमा से बाहर है। यहां तक ​​कि अगर -2147483648 नहीं होगा!

वैसे भी, चेतावनी से छुटकारा पाने के लिए, आप स्थिरता को -2147483648LL लिखकर 64 बिट संख्या में बदल सकते हैं।
हालांकि यह अधिक है, इसलिए पसंदीदा तरीका INT_MIN को निरंतर उपयोग करना होगा। लेकिन फिर आपको <limits.h> शामिल करना होगा।

+2

पूरी तरह से सही/सटीक नहीं है। सी 8 9 कहता है: 'एक पूर्णांक स्थिरांक का प्रकार इसी सूची का पहला है जिसमें इसका मूल्य प्रदर्शित किया जा सकता है। असम्बद्ध दशमलव: int, long int, unsigned long int; unsuffixed ऑक्टल या हेक्साडेसिमल: ... '। इसलिए, किसी पुराने कंपाइलर या आधुनिक कंपाइलर के लिए किसी प्रकार की संगतता मोड 2147483648 में काम करने में विफल हो जाएगा यदि यह 'हस्ताक्षरित लंबे' में फिट नहीं हो सकता है, सादा 'int' नहीं। सी 99 उस सूची को 'लम्बी लंबी int' और 'हस्ताक्षरित लंबे लंबे int' के साथ विस्तारित करता है और सी 99 मोड में प्रत्यय (यू) एलएल अनावश्यक है। बेशक, कंपाइलर कीड़े या तो अनसुनी नहीं हैं। –

+0

तब आप चेतावनी कैसे समझाएंगे? मैंने परीक्षण किया, और मुझे जीसीसी 4.3.2 के साथ ओपी के समान चेतावनी मिली, और जब मैंने एलएल प्रत्यय का उपयोग किया तो कोई चेतावनी नहीं मिली। –

+0

इसका मतलब है कि जीसीसी डिफ़ॉल्ट रूप से सी 99 मोड में नहीं है। यदि आप '-std = c99' जोड़ते हैं, तो यह एक अलग चेतावनी उत्पन्न करेगा और फिर: डेटा प्रकार की सीमित सीमा के कारण तुलना हमेशा सत्य होती है "। आश्चर्य। मैं वास्तव में यह भी सुनिश्चित नहीं कर रहा हूं कि डिफ़ॉल्ट रूप से यह किस मोड में है और क्यों। –

1

हां, 2147483648 मान्य सकारात्मक मूल्य नहीं है क्योंकि यह 32 बिट मशीनों पर 2 के पूरक के लिए सीमा से बाहर है, इसलिए वे आपको चेतावनी देने की कोशिश कर रहे हैं कि कुछ कंपाइलरों पर यह आपको वह मूल्य नहीं दे सकता है जो वे चाहते हैं एक आधुनिक तरीके से अस्वीकृति को संभाल नहीं है।

मुझे लगता है कि यदि आप अधिकतर सीमाओं को देखते हैं तो यह एक और जवाब जोड़ने लायक है। आप देखेंगे कि वे (-2147483647 - 1) का उपयोग करके इस पर पहुंचते हैं।

+0

अजीब चाल !! – malat

12

दशमलव पूर्णांक स्थिरांक के प्रकारों के नियम आईएसओ सी मानक के 1 99 0 और 1 999 संस्करणों के बीच बदल गए।

1 99 0 संस्करण में, एक असफल दशमलव पूर्णांक निरंतर प्रकार int, long int, या unsigned long int का पहला भाग है जिसमें इसका मूल्य प्रदर्शित किया जा सकता है। (सीया unsigned long long प्रकार नहीं था)।

1 999 और 2011 के संस्करणों में, इसका प्रकार int, long int, long long int में से एक है; यह किसी भी हस्ताक्षरित प्रकार का कभी नहीं है।

एक विशेष निरंतर प्रकार (जैसे 2147483648) आपके द्वारा उपयोग किए जा रहे कंपाइलर के पूर्णांक प्रकारों की श्रेणियों के आधार पर अलग-अलग होगा। अपने संकलक के long प्रकार 32 बिट होने वाला है, तो 2147483648 अपने संकलक C90 नियमों का उपयोग करता है, या के प्रकार long long अगर अगर यह सी 11 नियमों का उपयोग करता है (long long कम से कम 64 बिट्स होने की गारंटी है) प्रकार unsigned long का हो जाएगा। संकलक आपको इसके बारे में चेतावनी दे रहा है।

आप निरंतर प्रकार निर्दिष्ट करने के लिए प्रत्यय जोड़ सकते हैं - लेकिन सादे हस्ताक्षरित int के लिए कोई प्रत्यय नहीं है। आप unsigned int, Llong, UL के लिए बिना हस्ताक्षर किए लंबे, और आगे के लिए जोड़ सकते हैं।

यह ध्यान रखना महत्वपूर्ण है कि -2147483648 एक पूर्णांक निरंतर नहीं है; बल्कि 2147483648 स्वयं एक पूर्णांक स्थिर है, और -2147483648 एक अभिव्यक्ति है जो उस निरंतर शून्य यूनिट ऑपरेटर को लागू करती है।C90 नियमों के तहत, अगर लगातार प्रकार unsigned long की है, कि एक अहस्ताक्षरित एकल शून्य से है, जो अहस्ताक्षरित गणित के नियमों के तहत मूल्य 2147483648 पैदावार है। C99 या C11 नियमों के तहत, 2147483648 प्रकार के होने की संभावना है (हस्ताक्षरित) long long, और यह negating -2147483648 पैदावार भी प्रकार long long की।

कभी-कभी आपको कोड (-2147483647 - 1) का उपयोग करता है इस समस्या से बचने के लिए दिखाई देगा; एक 32-बिट int दिया, 2147483647 प्रकार int की है और अभिव्यक्ति की परिणाम अतिप्रवाह बिना उम्मीद int मूल्य अर्जित करता है।

बेशक अगर आपके संकलक पूर्णांक प्रकार के लिए अलग अलग आकार है, इस और भी जटिल हो सकता है।

+0

महान और स्पष्ट उत्तर के लिए धन्यवाद। पूर्णता के लिए कार्यान्वयन-परिभाषित _extended पूर्णांक प्रकार_ के बारे में वर्णित सी मानक पर उस 1999 संस्करण को जोड़ने के लायक हो सकता है। यदि कोई भी प्रकार पर्याप्त नहीं है, तो निरंतर इस तरह के विस्तारित प्रकार को अंतिम रूप में प्राप्त कर सकते हैं। उदाहरण के लिए जीसीसी (संस्करण 4.4.7) निरंतर '9 223372036854775808' (यानी 2^63) 16 बाइट्स डेटाटाइप' __int128_t' में "प्रचारित" है (इस तथ्य के बावजूद कि यह "सत्य" ईआईटी नहीं है)। Plese यह भी ध्यान दें कि ये नियम octal और हेक्साडेसिमल प्रतिनिधित्व के लिए थोड़ा अलग हैं, लेकिन मुझे लगता है कि ओपी केवल दशमलव में रुचि रखते थे। –

+1

'यू' प्रत्यय का अर्थ हस्ताक्षरित है लेकिन जरूरी नहीं कि' हस्ताक्षरित int ', उदा। यदि 'हस्ताक्षर किए गए int' के लिए केवल 'यू' के साथ दशमलव स्थिरता बहुत बड़ी है, तो इसमें' unsigned long' टाइप होगा। इसी प्रकार, 'एल'' लंबे समय तक 'अपग्रेड करेगा "यदि मान' लंबे' में फिट नहीं होता है। –

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