10

यह सवाल Implicit type conversion rules in C++ operators (और कई अन्य) राज्यलागू रूपांतरण: निम्नलिखित चेतावनी वैध है?

अगर मैं MSVC के अंतर्गत निम्नलिखित है तो या तो लंबे अहस्ताक्षरित है पूर्णांक अन्य लंबे अहस्ताक्षरित int

हालांकि करने के लिए प्रोत्साहित किया जाता है:

:
unsigned int a = <some expression>; 
unsigned long long b = a << 32ULL; 

दूसरी पंक्ति निम्न चेतावनी उत्पन्न करता है 0

warning C4293: '<<': shift count negative or too big, undefined behavior 

32ULL एक 64 बिट हस्ताक्षरित मूल्य है, इसलिए निहित रूपांतरण नियमों के अनुसार इसका मतलब यह होना चाहिए कि a को unsigned long long में भी परिवर्तित कर दिया गया है। इसलिए मैं 64 बिट्स द्वारा 64 बिट मान को स्थानांतरित कर रहा हूं, स्पष्ट रूप से एक अच्छी तरह परिभाषित ऑपरेशन।

क्या एमएसवीसी खराब है या मेरे तर्क में कोई दोष है?

+1

शिफ्ट विशेष हैं। –

+0

विजुअल स्टूडियो 2015. उसने कहा, मैं 99.9% निश्चित हूं कि हमें उन्नयन से पहले वीएस 2010 से एक ही चेतावनी मिली है, और वीएस 2017 के साथ त्वरित परीक्षण भी वही चेतावनी देता है। – dgnuff

+0

इसे भाषा वकील टैग की आवश्यकता है। यह 'सामान्य अंकगणितीय रूपांतरण' और 'अभिन्न प्रचार' के बीच सूक्ष्म अंतर है। वे अलग-अलग चीजें हैं लेकिन दोनों होते हैं और दोनों मूल्यों को परिवर्तित कर सकते हैं। – Persixty

उत्तर

15

शिफ्ट तथाकथित "सामान्य अंकगणितीय रूपांतरण" नहीं करते हैं, जो आपके द्वारा उद्धृत नियम हैं। They only perform integral promotions। एक शिफ्ट का परिणाम the same type as the promoted left operand है।

+0

क्या कोई इस मुद्दे के आसपास हो सकता है, एक से बी तक असाइनमेंट करके, फिर बी को स्थानांतरित कर सकता है? – EvilTeach

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