2010-08-22 11 views
6

(उन दोनों CentOS कर रहे हैं) मैं कोड की निम्न पंक्ति के लिए integer constant is too large for ‘long’ type त्रुटि मिलती है 32-बिट मंच के लिए 64-बिट से स्विच करने के बाद32-बिट प्लेटफॉर्म पर 64-बिट पूर्णांक को कोई मान निर्दिष्ट नहीं कर सकते

uint64_t Key = 0x100000000; 

मूल्य कास्टिंग मदद नहीं करता है। मैं क्या गलत कर रहा हूं?

धन्यवाद

उत्तर

10

आप सही प्रकार का पूर्णांक लगातार बनाने की जरूरत है। समस्या यह है कि 0x100000000 को int के रूप में व्याख्या किया गया है, और कास्टिंग/असाइनमेंट सहायता नहीं करता है: स्थिरता int के लिए स्वयं भी बहुत बड़ी है।

uint64_t Key = UINT64_C(0x100000000); 

यह करना होगा: आप कि लगातार uint64_t प्रकार का है निर्दिष्ट करने के लिए सक्षम होना चाहिए। आप UINT64_C उपलब्ध नहीं है, तो कोशिश:

uint64_t Key = 0x100000000ULL; 

वास्तव में, C99 में (6.4.4.1p5):

एक पूर्णांक निरंतर के प्रकार में इसी सूची के पहले है जिसका मूल्य दर्शाया जा सकता है।

और किसी भी प्रत्यय के बिना हेक्साडेसिमल स्थिरांकों के लिए सूची है:

int 
long int unsigned int 
long int 
unsigned long int 
long long int 
unsigned long long int 

तो अगर आप C99 मोड में अपने संकलक लागू, आप एक चेतावनी नहीं मिलना चाहिए (धन्यवाद जाइल्स!)।

0

कोई गारंटी है, लेकिन आप कोशिश कर सकते हैं:

uint64_t Key = 0x100000000ULL; 
4

जो आपने लिखा है वह पूरी तरह से मान्य है C99 (मान लीजिए कि आपके पास #include डी <stdint.h> है) ¹। तो ऐसा लगता है कि आपने C99 मोड की बजाय C89 मोड में अपना कंपाइलर लगाया है। सी 8 9 में, इस बात की कोई गारंटी नहीं है कि 64-बिट प्रकार उपलब्ध है, लेकिन यह एक आम एक्सटेंशन है।

चूंकि आप लिनक्स पर हैं, इसलिए आपका कंपाइलर संभवतः जीसीसी है। जीसीसी सभी प्लेटफार्मों पर भी 64-बिट long long का समर्थन करता है, यहां तक ​​कि सी 8 9 मोड में भी। लेकिन आप स्पष्ट रूप से long long के रूप में निरंतर घोषित करने के लिए हो सकता है:

uint64_t Key = 0x100000000ull; 

(ll मतलब है long long; u अहस्ताक्षरित का मतलब है और यहाँ वैकल्पिक है)। वैकल्पिक रूप से, आपके साथ सी 99 मोड में जीसीसी चलाने के लिए चाहते हैं।

¹ भाषा वकीलों के लिए: और वास्तव में 64 मूल्य बिट्स के साथ एक अभिन्न प्रकार है।

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