2010-08-14 17 views
23

आम तौर पर, सी की आवश्यकता है कि एक बाइनरी ऑपरेटर के ऑपरेटरों को उच्च रैंकिंग ऑपरेंड के प्रकार में पदोन्नत किया जाता है। यह अत्यधिक शब्द डाले साथ कोड भरने से बचने के लिए, उदाहरण के लिए इस्तेमाल किया जा सकता:बिट्सफ़्ट और पूर्णांक पदोन्नति?

if (x-48U<10) ... 
y = x+0ULL << 40; 

आदि

हालांकि, मैं पाया है कि, कम से कम जीसीसी के साथ, इस व्यवहार bitshifts के लिए काम नहीं करता। अर्थात।

int x = 1; 
unsigned long long y = x << 32ULL; 

मैं पैदा करने के लिए बाएँ हाथ संकार्य unsigned long long करने के लिए प्रोत्साहित किया जाना है ताकि पारी सफल होता है दायां संकार्य के प्रकार उम्मीद करेंगे। लेकिन इसके बजाय, जीसीसी प्रिंट एक चेतावनी:

warning: left shift count >= width of type 

जीसीसी टूटी हुई है, या मानक bitshifts के लिए प्रकार पदोन्नति नियमों के कुछ अपवाद है?

+0

चेतावनी के बावजूद, क्या यह किसी भी तरह से प्रचार करेगा? (यह सिर्फ एक चेतावनी है, सब के बाद)। –

+1

क्या आप वर्बोज़ कास्ट बनाने के लिए सिर्फ एक लघु मैक्रो का उपयोग नहीं कर सके? '# परिभाषित यूएलएल (एक्स) ((लंबे समय तक हस्ताक्षर किए गए) x)'? – Borealid

+1

@ रॉबर्ट: नहीं, यह नो-ऑप बनाता है, जैसे कि मैंने सादा लिखा था << 32'। @ बोरेलिड: हाँ मैं कर सकता था, लेकिन मुझे कोड लिखना पसंद है जिसे अतिरिक्त परिभाषित/शीर्षकों की आवश्यकता के बिना कहीं भी कॉपी और पेस्ट किया जा सकता है (उदा। अन्य परियोजनाएं)। मुझे 'टाइपिफ अनगिनत int uint' जैसी चीज़ों से नफरत है; –

उत्तर

23

तथाकथित सामान्य अंकगणितीय रूपांतरण कई बाइनरी ऑपरेटरों पर लागू होते हैं, लेकिन उनमें से सभी नहीं। उदाहरण के लिए वे बिट शिफ्ट ऑपरेटरों, & &, ||, अल्पविराम ऑपरेटर, और असाइनमेंट ऑपरेटर पर लागू नहीं होते हैं।

6.5.7 ... 3 शब्दार्थ ...
पूर्णांक प्रोन्नति ऑपरेंड में से प्रत्येक पर प्रदर्शन कर रहे हैं: यह थोड़ा बदलाव ऑपरेटरों के लिए नियम है। परिणाम का प्रकार प्रचारित बाएं ऑपरेंड का है। यदि दाएं ऑपरेंड का मान नकारात्मक है या प्रचारित बाएं ऑपरेंड की चौड़ाई से अधिक या बराबर है, तो व्यवहार अपरिभाषित है।

+1

धन्यवाद, यह वही है जो मैं ढूंढ रहा था। –

0

मुसीबत वास्तव में है कि पदोन्नति केवल जो कुछ भी अपने मंच एक int के रूप में परिभाषित करता है अप करने के लिए काम करता है। जैसा कि कुछ अन्य उत्तरों ने कहा है, बिट-शिफ्ट ऑपरेटर बाएं ऑपरेंड को एक int में बढ़ावा देगा। हालांकि, यहां एक int को 32-बिट मान के रूप में परिभाषित किया गया है। पूर्णांक रूपांतरण long long (64-बिट) को बढ़ावा नहीं देगा।