2011-06-07 8 views
7

जब मैं इस तरह सी में दो अहस्ताक्षरित वर्ण गुणा करते हैं:ओवरफ़्लो जब हस्ताक्षरित वर्ण गुणा करते हैं?

unsigned char a = 200; 
unsigned char b = 200; 
unsigned char c = a * b; 

तो मैं जानता हूँ कि मैं एक अतिप्रवाह होगा, और मैं एक परिणाम के रूप (40'000 सापेक्ष 256)। जब मैं ऐसा करता हूं:

unsigned char a = 200; 
unsigned char b = 200; 
unsigned int c = (int)a * (int)b; 

मुझे सही परिणाम 40'000 मिलेगा। हालांकि, मुझे नहीं पता कि इसके साथ क्या होता है:

unsigned char a = 200; 
unsigned char b = 200; 
unsigned int c = a * b; 

क्या मुझे यकीन है कि सही चीज होती है? क्या यह कंपाइलर निर्भर है? इसी तरह, मैं नहीं जानता कि जब एक घटाव कर क्या होता है:

unsigned char a = 1; 
unsigned char b = 2; 
int c = a - b; 

जब बनाने "सी" एक अहस्ताक्षरित चार, मैं शायद एक परिणाम के रूप में 255 मिल जाएगा। क्या होता है जब मैं इस तरह int int का उपयोग करता हूं?

उत्तर

7

अंकगणितीय ऑपरेटरों के तर्क "सामान्य अंकगणितीय प्रचार" प्राप्त करते हैं।

ऐसे मामलों में जहां int सभी ऑपरेटरों के सभी मूल्यों का प्रतिनिधित्व कर सकता है (इस पर अधिकांश कार्यान्वयन में आपके उदाहरण के मामले में), तर्क पहले int में परिवर्तित हो जाते हैं। तो दोनों मामलों में, आपको सही परिणाम मिलते हैं।

+0

यूप, "पदोन्नति" कीवर्ड था। यहां मुझे कुछ और विवरण मिला: https://www.securecoding.cert.org/confluence/display/seccode/INT02-C.+Understand+integer+conversion+rules –

1

इस जवाब से कॉपी किया गया In a C expression where unsigned int and signed int are present, which type will be promoted to what type?

6.3.1.3 हस्ताक्षरित और अहस्ताक्षरित पूर्णांकों

1 जब पूर्णांक प्रकार के साथ एक मूल्य के एक अन्य पूर्णांक _Bool के अलावा अन्य प्रकार में बदल जाती है, अगर मान हो सकता है नए प्रकार के प्रतिनिधित्व, यह अपरिवर्तित है।

2 अन्यथा, यदि नया प्रकार हस्ताक्षरित है, तो मान को बार-बार जोड़कर परिवर्तित किया जाता है या> अधिकतम मान से अधिक एक घटाया जाता है जिसे नए प्रकार में प्रदर्शित किया जा सकता है जब तक कि> नए प्रकार की सीमा में नहीं है ।

3 अन्यथा, नया प्रकार हस्ताक्षरित है और इसमें मूल्य का प्रतिनिधित्व नहीं किया जा सकता है; या तो> परिणाम कार्यान्वयन-परिभाषित या कार्यान्वयन-परिभाषित संकेत उठाया गया है।

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