2010-02-28 19 views
12

के लिए कंपाइलर चेतावनी मेरे पास निम्न सरणी है, मुझे बिटमैप्स पर हाथ से काम करने की आवश्यकता है।सी ++: बड़े हस्ताक्षरित int

const unsigned int BITS[32] = {1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 
           2048, 4096, 8192, 16384, 32768, 65536, 131072, 
           262144, 524288, 1048576, 2097152, 4194304, 
           8388608, 16777216, 33554432, 67108864, 134217728, 
           268435456, 536870912, 1073741824, 2147483648}; 

दुर्भाग्य से, जब संकलित मैं

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

में अहस्ताक्षरित है मैं यह कैसे हटा सकता हूँ?

+0

इस समान प्रश्न देखें: http://stackoverflow.com/questions/2347936/cant-get-ride-of-this-decimal-constant -इस-हस्ताक्षरित-केवल-इन-आईएसओ-सी 0 9-चेतावनी –

+0

आप ऐसा क्यों कर रहे हैं? यदि आपको लगता है कि एक लुकअप टेबल आवश्यकतानुसार इन मानों को कंप्यूटिंग करने की तुलना में तेज़ होने जा रहा है, तो फिर से सोचें ... – Nemo

उत्तर

15

सी में इंटीजर अक्षर, डिफ़ॉल्ट रूप से "हस्ताक्षरित int" टाइप करें (संपादित करें: लेकिन चेतावनियों के लिए टिप्पणियां देखें)। पिछले संख्या बहुत बड़ी है एक हस्ताक्षरित 32-बिट पूर्णांक के रूप में प्रतिनिधित्व किया जा रहा है, और इसलिए आप "यू" के साथ प्रत्यय लगाना द्वारा संकलक है कि यह एक अहस्ताक्षरित पूर्णांक है बताने के लिए की जरूरत है, के रूप में:

2147483648U 

ध्यान दें कि आप इसे "लंबा" बनाने के लिए "एल" का प्रत्यय भी जोड़ सकते हैं, लेकिन कई प्रणालियों पर जो अभी भी 32-बिट है और इस प्रकार अप्रासंगिक है।

इसके अलावा

, वहाँ थोड़ा-शिफ्ट ऑपरेटर के साथ एक बहुत कम त्रुटि प्रवण (और आसान करने के लिए पढ़ने के लिए) जिस तरह से इस कोड को लिखने के लिए दिया गया है:

const unsigned int BITS[32] = {1U, 1U<<1, 1U<<2, 1U<<3, 1U<<4, 
           /* and so on */ 
           1U<<31}; 

या, हेक्साडेसिमल लेखन में, यदि आप डॉन कुछ कारणों से बिट शिफ्ट की तरह नहीं:

const unsigned int BITS[32] = {0x1, 0x2, 0x4, 0x8, 0x10, 0x20, 
           /* and so on */ 
           0x80000000U}; 
+0

क्यों कंपाइलर इसे एक int के रूप में मानता है, बल्कि फिर इसे स्वचालित रूप से बदल देता है? विशेष रूप से, यह वास्तव में जानता है कि यह किस प्रकार संग्रहीत किया जाएगा। – gruszczy

+0

कई मामलों में आप नहीं जानते कि स्थिरता किस प्रकार है (उदाहरण के लिए, एक varargs फ़ंक्शन में फ़ंक्शन तर्क के रूप में) इसलिए इसे स्पष्ट रूप से निर्दिष्ट किया जाना चाहिए। इस बात को भ्रमित करने में भ्रमित है कि इस प्रकार को कुछ बार निहित किया जाना चाहिए और दूसरों में स्पष्ट रूप से निर्दिष्ट करने की आवश्यकता है, और यह भी अलग-अलग int आकार वाले सिस्टम पर अलग-अलग प्रकार के होते हैं। इसके अलावा, क्योंकि सी उस तरह के प्रकार को कभी भी पसंद नहीं करता है, इस मामले के लिए इसे जोड़कर पार्सर को काफी लाभ के बिना बहुत जटिल बना दिया जाएगा। –

+3

@gruszczy: C89/90 में एक असफल दशमलव निरंतर को 'int', 'long' या' unsigned long' (जो भी पहले फिट बैठता है) के रूप में व्याख्या किया जाना चाहिए। सी 99 में इसे 'int',' long' या 'long long' (जो भी पहले फिट बैठता है) के रूप में व्याख्या किया जाना चाहिए। यह संकलक इस चेतावनी से क्या कहने की कोशिश कर रहा है। जाहिर है, इस मंच पर 'लम्बा' का आकार 'int' जैसा ही है। कंपाइलर मूल रूप से कह रहा है: "हो सकता है कि आप एक 'हस्ताक्षरित लंबे' कॉन्स्टेंट या शायद 'लंबे समय तक' निरंतर बनाने की कोशिश कर रहे थे, लेकिन सी 8 9/9 0 नियमों से मुझे इसे 'हस्ताक्षरित लंबा' बनाना होगा। – AnT

6

आपका निरंतर बस

2147483648U 
एक अहस्ताक्षरित पूर्णांक के लिए

भी अहस्ताक्षरित के रूप में निर्दिष्ट किया जाना है, का उपयोग

2147483648UL 

(यूएल = अहस्ताक्षरित लांग) है, या।

जैसा कि आपका कोड अभी है, एक स्थिर, जो डिफ़ॉल्ट रूप से एक सादा int है, और इसलिए हस्ताक्षरित है, को unsigned int पर असाइन किया गया है, जो आपकी चेतावनी उत्पन्न करता है।

+0

यह काम करता है, बहुत बहुत धन्यवाद :-) – gruszczy

+3

पेडेंडिकली बोलते हुए, त्रुटि यह नहीं है कि तथ्य (सादा int) निरंतर एक हस्ताक्षरित int को आवंटित किया जाता है; असाइनमेंट अप्रासंगिक है। त्रुटि यह है कि "2147483648" का मान हस्ताक्षरित int होने के लिए बहुत बड़ा है, और इसलिए पहले स्थान पर हस्ताक्षरित int स्थिरता उत्पन्न करने में एक अतिप्रवाह है। –

+2

वास्तव में, चेतावनी का वास्तविक कारण यह है कि संकलक को निरंतर प्रकार के लिए 'हस्ताक्षरित लंबा' चुनना होता है। (नोट, फिर से, यह निरंतर 'हस्ताक्षरित int' नहीं है, यह 'हस्ताक्षरित लंबा' है।) और इसे एक बड़े हस्ताक्षरित प्रकार (जिसे यह समर्थन दे सकता है) चुनने के बजाय इसे C89/90 में चुनना है या C99 का पालन करना है नियम और 'लंबे समय तक' चुनना। यही चेतावनी है और यह 'आईएसओ सी 0 9 0 क्यों है। सी 99 में, उदाहरण के लिए, एक असफल दशमलव स्थिर निरंतर एक हस्ताक्षरित प्रकार नहीं दिया जाएगा। – AnT

1

डेटा प्रकार को बिना हस्ताक्षरित के रूप में परिभाषित करने के लिए आवश्यक नहीं है;

int variable_name=2147483648U; 
बाकी

सिर्फ हेक्स के लिए दशमलव मान परिवर्तित ...

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