2012-06-17 6 views
5

मैं जीसीसी संकलक के माध्यम से इस कोड को निष्पादित करने के लिए कोशिश कर रहा था बिना अजीब उत्पादन:typecasting

#include <stdio.h> 
int main() 
{ 
    unsigned long long int x; 
    x = 75000 * 75000; 
    printf ("%llu\n", x); 
    return 0; 
} 

लेकिन यह गलत उत्पादन दे दी है।

मैं तो इस की कोशिश की:

#include <stdio.h> 
int main() 
{ 
    unsigned long long int x; 
    x = (unsigned long long)75000 * (unsigned long long)75000; 
    printf ("%llu\n", x); 
    return 0; 
} 

और यह सही उत्पादन दे दी है!

ऐसा क्यों है?

+1

ध्यान दें कि आपको पूरी अभिव्यक्ति को बढ़ावा देने के लिए केवल एक स्थिरांक डालना होगा। – Clifford

उत्तर

9

अभिव्यक्ति 75000 * 75000 दो पूर्णांक स्थिरांक का गुणा है। इस अभिव्यक्ति का परिणाम भी एक पूर्णांक है और अतिप्रवाह हो सकता है। नतीजा तब एक लंबे समय तक एक हस्ताक्षरित असाइन किया गया है, लेकिन यह पहले से ही बह गया है इसलिए परिणाम गलत है।

बिना हस्ताक्षर किए लंबे लंबे स्थिरांक लिखने के लिए ULL प्रत्यय का उपयोग करें।

x = 75000ULL * 75000ULL; 

अब गुणा अधिक नहीं होगा।

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