2010-04-16 13 views
6

आज मैं निम्नलिखित पाया:चार गुणा और सी में एक साथ int

#include <stdio.h> 

int main(){ 
char x = 255; 
int z = ((int)x)*2; 

printf("%d\n", z); //prints -2 

return 0; 

} 
तो मूल रूप से, क्योंकि आकार सीमा = के दाईं ओर ऑपरेंड से निर्धारित होता है पर हस्ताक्षर मैं एक अतिप्रवाह हो रही है

??

काम को गुणा करने से पहले इसे int में क्यों नहीं डाला जाता है?

इस मामले में मैं एक char और int का उपयोग कर रहा हूं, लेकिन यदि मैं "लंबा" और "लंबा लंबा int" (c99) का उपयोग करता हूं, तो मुझे समान व्यवहार मिलता है। क्या यह आम तौर पर विभिन्न आकारों के संचालन के साथ अंकगणित करने के खिलाफ सलाह दी जाती है?

उत्तर

11

char या तो पर हस्ताक्षर किए जा सकते हैं या अहस्ताक्षरित, अपने संकलक पर निर्भर करता है।

आपके मामले में, यह हस्ताक्षरित प्रतीत होता है, और 255 उस सीमा से बाहर है जो इसे प्रदर्शित कर सकता है (संभवतः, यह केवल -128 से 127 तक की संख्या का प्रतिनिधित्व कर सकता है)।

तो समस्या तब होती है जब आप अपने char चर के लिए 255 असाइन करते हैं - इसका परिणाम कार्यान्वयन-परिभाषित मान में होता है, जो आपके मामले में -1 होता है।

जब आप -1 से 2 गुणा करते हैं, तो आपको -2 मिलता है। वहां कोई रहस्य नहीं है। (int) पर कास्ट कुछ भी नहीं करता है - int से संकुचित प्रकार हमेशा int या unsigned int पर प्रचारित किए जाने से पहले किसी भी गणना के साथ प्रचारित किए जाते हैं।

4

नहीं, आपको दूसरी पंक्ति (गुणा) पर ओवरफ़्लो नहीं मिल रहा है। समस्या यह है कि आपका कंपाइलर डिफ़ॉल्ट रूप से signed char और 255 ओवरफ़्लो का उपयोग कर रहा है और इसका मतलब -1 होगा। असल में, आप -1 के मान के साथ परिवर्तनीय x प्रारंभ कर रहे हैं। Int -1 से int का परिणाम -1 (signed ऑपरेटरों को अपवादों में साइन-विस्तारित किया जाएगा जबकि unsigned ऑपरेंड शून्य-विस्तारित होंगे)।

आप unsigned उपसर्ग जोड़कर charunsigned होने के लिए मजबूर कर सकते हैं:

unsigned char x = 255; 
5

ऐसा लगता है कि चार अपने मंच पर हस्ताक्षर किए है। तो char x = 255 प्रभावी रूप से char x = -1 जैसा ही है। Int को कास्ट कोई फर्क नहीं पड़ता।

है कि बदलने का प्रयास करें:

unsigned char x = 255; 
3

अन्य उत्तरों अच्छी तरह से समझाते हैं कि आपका उदाहरण "काम करता है", इसलिए मैं इसे फिर से समझाऊंगा।

हालांकि, मुझे देख सकते हैं कि क्या आप उपयोग करना चाहते एक "अहस्ताक्षरित 8 बिट पूर्णांक", है अगर बस (और इसके 16, 32, 64 बिट साथी) का उपयोग करें और सभी char रों से दूर रखने के <stdint.h> के uint8_t पहले से ही जाने , इस दुनिया में short एस और int एस।

+1

# इन प्रकारों के लिए शामिल करें। – slartibartfast

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