2009-04-19 22 views
6

दूसरे शब्दों में यह काम अपेक्षित है?32 बिट int * 32 बिट int = 64 बिट int?

int32 i = INT_MAX-1; 
int64 j = i * i; 

या मैं पहली बार 64 बिट के लिए मैं कास्ट करने के लिए की जरूरत है?

+2

यह आपकी अपेक्षाओं पर निर्भर करता है - लेकिन विल डीन क्या होता है इसके बारे में सही है, और संभवतया आप अपेक्षा नहीं करते हैं। –

+0

जांचें: http://stackoverflow.com/questions/245740/which-variables-should-i-typecast-when-doing-math-operations-in-cc/245986#245986 –

उत्तर

17

आपको कम से कम एक ऑपरेंड को गुणा करने की आवश्यकता है। बिंदु पर गुणा किया जा रहा है, सिस्टम नहीं जानता कि आप int64 को असाइन करने की योजना बना रहे हैं।

+4

आम चाल इसके बजाय 1 एल पहले गुणा कर रही है कास्टिंग: int64 j = 1L * i * i; यह काम करता है यदि आपकी लंबी 64-बिट लंबाई है। – stepancheg

+3

और यदि आपका 'लंबा' केवल 32 बिट्स है, तो आप अधिकांश आधुनिक कंपाइलरों पर 1 एलएल का उपयोग कर सकते हैं। –

+1

या आप इसे उचित पोर्टेबल बनाने के लिए stdint.h से INT64_C (1) का उपयोग कर सकते हैं (आपको एमएस कंपाइलर्स के लिए stdint.h खोदने की आवश्यकता हो सकती है, शायद MinGW से या http://www.azillionmonkeys.com/qed/ से pstdint.h –

7

यह क्या int32 और int64 हैं पर निर्भर करता है (जब तक int64 वास्तव में अपने विशेष प्रणाली है, जो संभावना नहीं लगता है के लिए देशी पूर्णांक प्रकार है)।

संक्षेप में, सभी पूर्णांकों किसी भी अंकगणितीय आपरेशनों पहले कम से कम 'int' आकार (जो 64 बिट्स हो सकता है) करने के लिए प्रोत्साहित कर रहे हैं, और बाइनरी ऑपरेटरों के लिए बड़ा संकार्य के आकार के है, तो यह किसी पूर्णांक से अधिक रैंक के है ।

अभिव्यक्ति का परिणाम कैसे उपयोग किया जाता है (चाहे वह व्यापक प्रकार में संग्रहीत है या नहीं) अभिव्यक्ति के घटक भागों के प्रचार पर कोई असर नहीं पड़ता है।

+0

+1 निर्धारित करने के बजाय व्याख्या करने के लिए +1 –

0

दो संख्याओं को देखते हुए, बी और प्रत्येक संख्या len_a और len_b बिट्स का उपयोग करती है।

आपके आउटपुट डेटाटाइप को कम से कम आवश्यकता है: len_a और len_b बिट्स।

अपने उपरोक्त कोड में, आप दो 31 बिट संख्या है (क्योंकि INT_MAX - 1 = 0x7FFFFFFE 31 बिट का उपयोग करता है) और क्योंकि यह पहले गुणा और अतिप्रवाह एक 32 बिट क्या करेंगे आप उनमें से एक टाइपकास्ट करने int64_t करने की आवश्यकता होगी int64_t पर रहता है।


नियत बिन्दु गुणन के लिए आवश्यक बिट्स की संख्या:

a  = 7 
len_a = 3 

b  = 7 
len_b = 3 

c = a * b 
    = 49 (decimal) 
    = 0x31 (hex) 

len_c = howManyBits(0x31) 
     = 6 

आप बिट्स गिनती करने के लिए एक समारोह लिख सकते हैं:

len_output = howManyBits(a * b) 
      = len_a + len_b 

एक त्वरित उदाहरण कार्रवाई में ऊपर शासन को दिखाने के लिए । या यदि आप केवल विंडोज कैल्क जैसे कुछ उपयोग की पुष्टि करने के लिए त्वरित सैनिटी चेक चाहते हैं जो संख्या को बाइनरी रूप में परिवर्तित करेगा और उपयोग की जाने वाली बिट्स को गिनती होगी।

3

मूल उत्तर यह नहीं है कि आप जो भी चाहते हैं वह नहीं करेंगे।
लेकिन यह अपेक्षा करता है कि क्या अपेक्षित है।

दो बातें गणितीय क्रियाओं के बारे में गौर करने योग्य

  • दोनों ऑपरेंड एक ही प्रकार के हो जाएगा।
  • परिणामस्वरूप प्रकार इनपुट के समान होगा।

यदि कंपाइलर ऑपरेटरों के बीच एक मेल नहीं खाता है तो यह एक ऑपरेंड को परिवर्तित करेगा ताकि दोनों मैच (Which variables should I typecast when doing math operations in C/C++? देखें)। नोट: परिणाम के साथ क्या होता है, यह अलगाव में किया जाता है।

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