मुझे डर है कि मुझे कुछ मामूली याद आ रही है, लेकिन ऐसा लगता है कि यदि आप मूल हस्ताक्षरित मान को बनाए रखना चाहते हैं तो हस्ताक्षरित प्रकार से/में कनवर्ट करने का कोई वास्तविक सुरक्षित तरीका नहीं है।उसी आकार के हस्ताक्षरित/हस्ताक्षरित रूपांतरित करने के लिए कोई अनुपालन तरीका
reinterpret_cast पर, 5.2.10 पूर्णांक रूपांतरण के लिए एक पूर्णांक सूचीबद्ध नहीं करता है, इस प्रकार यह परिभाषित नहीं किया गया है (और static_cast कोई अतिरिक्त रूपांतरण परिभाषित नहीं करता है)। अभिन्न रूपांतरणों पर 4.7.3 मूल रूप से कहते हैं कि एक बड़े हस्ताक्षरित रूपांतरण को परिभाषित किया जाएगा (इस प्रकार पोर्टेबल नहीं)।
हम जानते हैं कि यह सीमित है, उदाहरण के लिए, uint64_t
किसी हार्डवेयर पर, int64_t
पर सुरक्षित रूप से परिवर्तनीय होना चाहिए और मूल्य में परिवर्तन किए बिना वापस। इसके अलावा मानक लेआउट प्रकारों के नियम वास्तव में सुरक्षित रूपांतरण की गारंटी देते हैं यदि हम memcpy
को असाइन करने के बजाय दो प्रकार के बीच थे।
क्या मैं सही हूँ? क्या कोई वैध कारण है कि कोई अभिन्न प्रकार के आकार के बीच reinterpret_cast
क्यों नहीं कर सकता है?
स्पष्टीकरण: निश्चित रूप से अहस्ताक्षरित के हस्ताक्षर किए संस्करण एक मूल्य गारंटी नहीं है, लेकिन यह केवल राउंड ट्रिप है कि मैं विचार कर रहा हूँ (अहस्ताक्षरित => हस्ताक्षर किए => अहस्ताक्षरित)
अद्यतन: उत्तर पर बारीकी से देखकर और मानक को पार करने के लिए, मुझे विश्वास है कि memcpy
वास्तव में काम करने की गारंटी नहीं है, क्योंकि कहीं भी यह नहीं कहता है कि दो प्रकार लेआउट संगत हैं, और न ही चार प्रकार हैं। आगे अद्यतन, सी-मानक में खोदना इस memcpy काम करना चाहिए, क्योंकि लक्ष्य का आकार काफी बड़ा है और यह बाइट्स की प्रतिलिपि बनाता है।
उत्तर: वहाँ कोई तकनीकी कारण है कि reinterpret_cast इस रूपांतरण प्रदर्शन करने की अनुमति नहीं थी प्रतीत होता है। इन निश्चित आकार पूर्णांक प्रकारों के लिए memcpy
काम करने की गारंटी है, और वास्तव में जब तक मध्यवर्ती सभी बिट-पैटर्न का प्रतिनिधित्व कर सकता है तो किसी भी मध्यवर्ती प्रकार का उपयोग किया जा सकता है (फ्लोट खतरनाक हो सकता है क्योंकि जाल पैटर्न हो सकते हैं)। आम तौर पर आप किसी भी मानक लेआउट प्रकार के बीच memcpy नहीं कर सकते हैं, वे संगत या चार प्रकार होना चाहिए। यहां इन्ट्स विशेष हैं क्योंकि उनके पास अतिरिक्त गारंटी है।
मुझे लगता है कि आप हमेशा ऐसा कर सकते हैं, reinterpret_cast के साथ आप बस संकलक को बताएं कि स्थान मूल्य बदलने के बिना स्मृति स्थान की व्याख्या कैसे करें। –
"किसी भी हार्डवेयर पर"। बिल्कुल यही बात है। शायद किसी भी हार्डवेयर पर जिसके साथ आप काम कर सकते हैं, लेकिन C++ को 2 अन्य पूरकों की तुलना में कुछ अन्य चीजों का समर्थन करने के लिए अकादमिक कारणों के लिए डिज़ाइन नहीं किया गया है, लेकिन वास्तव में ऐसे हार्डवेयर हैं। और (u) intXX_t प्रकारों को सिर्फ "as-if" computations में व्यवहार करने की आवश्यकता है, वे 2nds पूरक थे, हार्डवेयर की आवश्यकता नहीं है। – PlasmaHH
@PlasmaHH, मेरा मुद्दा यह है कि 'uint64_t',' int64_t' सटीक आकार (यदि हार्डवेयर पर समर्थित है) हैं और इस प्रकार 'memcpy' को कनवर्ट करने की गारंटी है (मानक लेआउट प्रकारों के नियमों के माध्यम से)। मुझे यहां 2 के पूरक की परवाह नहीं है, मैं पीछे और आगे रूपांतरण चाहता हूं। –