2011-03-30 12 views
10

int को 32 बिट और 64 बिट लिनक्स प्लेटफॉर्म पर C99 में size_t में कनवर्ट/कास्ट करने का उचित तरीका क्या है?सी: कास्ट int से size_t

उदाहरण:

int hash(void * key) { 
    //... 
} 

int main (int argc, char * argv[]) { 
    size_t size = 10; 
    void * items[size]; 
    //... 
    void * key = ...; 
    // Is this the right way to convert the returned int from the hash function 
    // to a size_t? 
    size_t key_index = (size_t)hash(key) % size; 
    void * item = items[key_index]; 
} 
+0

मैं क्यों यह काम नहीं होता नहीं दिख रहा। – slartibartfast

+0

साधारण सादे कास्ट '(size_t)' के साथ क्या समस्या है? क्या यह किसी भी तरह से "उचित" नहीं है? – AnT

+0

हाँ, यह सही है, हालांकि मुझे लगता है कि यह पूरी तरह से परिवर्तित हो गया है, इसलिए आपको वास्तव में * (size_t) 'की आवश्यकता नहीं है। –

उत्तर

15

सभी अंकगणितीय प्रकार सी में अंतर्निहित रूपांतरित होते हैं। यह बहुत दुर्लभ है कि आपको एक कास्ट की आवश्यकता होती है - आम तौर पर जब आप नीचे परिवर्तित करना चाहते हैं, तो मॉड्यूलो 1 प्लस को छोटे प्रकार के अधिकतम मूल्य को कम करना, या जब आपको अंकगणित को बलपूर्वक बल देना है हस्ताक्षरित अंकगणित के गुणों का उपयोग करने के लिए हस्ताक्षरित मोड।

व्यक्तिगत रूप से, मैं नापसंद देख डाले क्योंकि:

  1. वे बदसूरत दृश्य अव्यवस्था कर रहे हैं, और
  2. वे मेरे लिए सुझाव है कि व्यक्ति जो लिखा कोड प्रकार के बारे में चेतावनी हो रही थी, और डाले में फेंक दिया चेतावनियों के कारण को समझे बिना कंपाइलर को बंद करने के लिए।
बेशक

आप कुछ Ultra-picky चेतावनी का स्तर सक्षम हैं, तो आपके निहित रूपांतरण चेतावनी भी जब वे सही कर रहे हैं के बहुत सारे कारण हो सकता है ...

5
size_t key_index = (size_t)hash(key) % size; 

ठीक है। आपको वास्तव में कलाकारों की भी आवश्यकता नहीं है:

size_t key_index = hash(key) % size; 

वही काम करता है।

3
कास्टिंग मुद्दे से

एक तरफ (तुम नहीं जो जैसा कि पहले बताया गया है), कुछ और जटिल चीजें हैं जो कोड के साथ गलत हो सकती हैं।

यदि hash() को एक सरणी में एक इंडेक्स वापस करना है, तो उसे size_t भी वापस करना चाहिए। चूंकि ऐसा नहीं होता है, तो key_indexINT_MAX से बड़ा होने पर आपको अजीब प्रभाव मिल सकते हैं।

मैं कहूँगा कि size, hash(), key_index सभी एक ही प्रकार का होना चाहिए, शायद size_t, सुनिश्चित करने के लिए उदाहरण के लिए:

size_t hash(void * key) { 
    //... 
} 

int main (int argc, char * argv[]) { 
    size_t size = 10; 
    void * items[size]; 
    //... 
    void * key = ...; 

    size_t key_index = hash(key) % size; 
    void * item = items[key_index]; 
} 
+0

मुझे सी 99 मानक में कुछ भी नहीं मिला है जो सरणी अनुक्रमणिका को 'INT_MAX' से कम तक सीमित करता है। यदि आपको अजीब प्रभाव मिलते हैं, तो यह एक कंपाइलर बग है। स्पष्ट रूप से '10 JeremyP

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