2012-04-06 10 views
6

मैं सी में इस कोड है (यह केवल अध्ययन के लिए है):सी छोड़ पारी असफल

char x; 
    uint64_t total = 0; 

    for(x = 20; x < 30; x++){ 
     total = (((((1 << x) * x)/64) + 1) * sizeof(uint64_t)); 
     printf("%d - %llu\n", x, total);   
    }  

क्या छपा है:

20 - 2621448 
21 - 5505032 
22 - 11534344 
23 - 24117256 
24 - 50331656 
25 - 104857608 
26 - 218103816 
27 - 18446744073625665544 
28 - 18446744073575333896 
29 - 18446744073508225032 

क्यों उन x> 26 मैं क्या ज़रूरत है अजीब मूल्य? मैं उबंटू 10.10 64 बिट्स पर जीसीसी 4.6.1 पर हूं।

+0

लगता है कि समस्या चार एक्स पर है, मैंने इसके लिए uint64_t का उपयोग किया और अच्छा काम करता है। –

+0

यदि आप कुल = ((((1 << x) * x)/64) + 1) * sizeof (uint64_t)); 'कुल =' के लिए सरलीकृत किया गया है, तो आप यह देखने में सक्षम होंगे कि क्या अधिक स्पष्ट हो रहा है ((1 << x) * x); 'फिर' printf ("% d - 0x% llx \ n", x, कुल) के साथ मुद्रित; 'आपको nmber नकारात्मक को बदलने वाला साइन बिट दिखाई देगा, जिसे मुद्रित किया गया है printf द्वारा एक बड़ी संख्या ("... -% llu \ n", ... कुल); – gbulmer

उत्तर

18

क्योंकि 1 एक int, 32 बिट, तो (1 << 27)*27 अतिप्रवाह है। 1ull का प्रयोग करें।

अपनी टिप्पणी के बारे में, अगर x एक uint64_t है, तो 1 << x अभी भी एक int है, लेकिन गुणन के लिए यह uint64_t को ढाले गए होते थे, इसलिए कोई अतिप्रवाह वहाँ होगा। हालांकि, अगर x >= 31, 1 << x अपरिभाषित व्यवहार होगा (क्योंकि परिणामस्वरूप मान को 32 बिट पूर्णांक प्रकार द्वारा दर्शाया नहीं जा सकता है)।

+0

यह वह आदमी है! धन्यवाद! –

0

मुझे लगता है कि तुम्हारी समस्या है, तो आप 32 बिट के साथ की गणना और एक 64 बिट मूल्य के लिए बाद में इसे आवंटित

64 से विभाजन ही है के रूप में बदलाव नहीं 6 बिट

char x; 
uint64_t one = 1; 
uint64_t total = 0; 

for(x = 20; x < 30; x++){ 
    total = ((((one << (x - 6)) * x) + 1) * sizeof(uint64_t)); 
    printf("%d - %llu\n", x, total);   
} 

अभी तक संकलित नहीं

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

  • कोई संबंधित समस्या नहीं^_^