2012-12-30 16 views
5

आप इस तरह के एक पूर्णांक चर के लिए एक पता कैसे आवंटित कर सकते हैं, शिकायतकर्ता कोई त्रुटि नहीं देगा। मैं आप केवल एक पूर्णांक चरपूर्णांक चर के लिए पते का असाइनमेंट

int a=0x28ff1c 

आप एक चार चर के लिए भी ऐसा ही कर सकते हैं करने के लिए पूर्णांक मूल्यों असाइन कर सकते हैं हमेशा हालांकि, संकलक एक त्रुटि कंसोल पर

char b=0x28ff1c 

यह होगा उत्पादन नहीं देंगे चार ख के लिए स्क्रीन बकवास मूल्य और पूर्णांक एक

cout<<b 
    <<endl; 
cout<<a; 

किसी ने मुझे बता सकते हैं क्यों चार ख के लिए उत्पादन में अंतर है और एक int के लिए एक यादृच्छिक मूल्य। क्या कोई मुझे बता सकता है कि एक चर चर और पूर्णांक परिवर्तक को

+3

'0x28ff1c' एक पूर्णांक मूल्य _is_ @Luchian ग्रिगोर द्वारा जवाब उपयोग करने के लिए कर सकते हैं। – Mat

उत्तर

5

संख्या 0x28ff1c दशमलव (बेस -10) संख्या 2686748 का हेक्साडेसिमल (बेस -16) प्रतिनिधित्व है। cout पूर्णांक के लिए दशमलव मान मुद्रित करने के लिए डिफ़ॉल्ट रूप से, संभवतः वह संख्या जिसे आपने मुद्रित किया है।

char b = 0x28ff1c के साथ मामला थोड़ा अलग है, क्योंकि

  1. char इतना बड़ा है कि मूल्य धारण करने के लिए नहीं है। व्यावहारिक परिणाम यह है कि यह 0x1c पर छोटा हो जाता है।
  2. coutchar विशेष रूप से व्यवहार करता है, क्योंकि आमतौर पर इसे सामान्य डेटा रखने के लिए उपयोग किया जाता है, इसलिए cout उस कोड को प्रिंट करता है जिसमें कोड 0x1c है, जो कि किसी प्रकार का नियंत्रण चरित्र है। उदाहरण के लिए आप 0x41 के साथ इसे आजमा सकते हैं (जो ASCII और UTF-8 में 'A' का प्रतिनिधित्व करता है)।

और ध्यान दें कि कुछ भी नहीं है जो 0x28ff1c को एक पता होने के रूप में चिह्नित करता है। एक पता &a या (void*)0x28ff1c द्वारा बनाया जाएगा।

+0

धन्यवाद धन्यवाद – Computernerd

+0

'(char *) 0x28ff1c' सुरक्षित है (जब तक आप 'intx' के लिए '0x28ff1c' सही ढंग से गठबंधन नहीं कर सकते) - सीसी। @ लिम बोनस प्रश्न - परिणाम काटा गया है, या ओवरफ्लो के कारण यह अनिर्धारित व्यवहार है (ध्यान में रखें कि 'char' हस्ताक्षरित है)? –

+0

@LuchianGrigore कार्यान्वयन-परिभाषित (जब तक 'CHAR_BIT> = 23') नहीं, यह संतृप्त, छोटा हो सकता है, सभी आउट-ऑफ-रेंज मानों को 13 तक मैप कर सकता है, कार्यान्वयन को केवल यह दस्तावेज करना है कि यह क्या करता है। सी में, यह एक कार्यान्वयन-परिभाषित सिग्नल भी बढ़ा सकता है। –

8

0x28ff1c कोई पता नहीं है - यह केवल एक हेक्साडेसिमल संख्या है।

अनुसरण कर रहे हैं बराबर:

int a = 2686748; //decimal number 
int a = 0x28ff1c; //hexadecimal number 
int a = 012177434; //octal number 

एक पते एक सूचक का प्रतिनिधित्व करती है - अगर यह सिर्फ इतना है कि है, पता, आप उपयोग कर सकते हैं एक void*:

void* p = (void*)0x28ff1c; 

में जो मामले

int a = p; 

संकलित नहीं होगा। p एक पता है, संख्या स्वयं नहीं है।

+0

@ लचिन आप int a और char b के आउटपुट में अंतर कैसे समझाते हैं और कैसे शिकायतकर्ता बी बी – Computernerd

+0

@ पूर्णांक को एक पूर्णांक मान निर्दिष्ट करते समय त्रुटि नहीं देता है, इसलिए यह केवल 1 बाइट है, इसलिए यह पकड़ नहीं सकता पूरा मूल्य एक चेतावनी * जारी की जा सकती है, लेकिन इसकी आवश्यकता नहीं है। आप मूल रूप से 'char' चर को बह रहे हैं (इसलिए यह गलत परिणाम प्रिंट करता है)। –

+0

@ लुचिन धन्यवाद – Computernerd

1

क्योंकि किसी भी शाब्दिक शुरुआत 0x वास्तव में एक पूर्णांक है। तो इसकी अनुमति है। एक पता कभी-कभी एक पूर्णांक हो सकता है।

+0

पता पूर्णांक नहीं हैं। कई कार्यान्वयन में, मुद्दों के बिना पते को पूर्णांक में परिवर्तित करना संभव हो सकता है। कुछ कार्यान्वयन में, पते में ऐसी संरचना हो सकती है जो एक पूर्णांक में अच्छी तरह से प्रदर्शित नहीं होती है (उदाहरण के लिए, किसी पते के एन्कोडिंग में 1 जोड़ना शायद उस पते का उत्पादन न करे जो स्मृति में 1 बाइट आगे है)। –

+0

अच्छा बिंदु @EricPostpischil। मैं कहूंगा "कभी-कभी कोई पता एक पूर्णांक हो सकता है" –

+0

@EricPostpischil मुझे नहीं लगता कि यह कैसे प्रासंगिक है। अनुमोदित, एक 'int' को कोई पता रखने की गारंटी नहीं है, लेकिन पॉइंटर अंकगणित यहां प्रश्न में नहीं है। आपने जो बताया है (एक पते में जोड़ना) उससे कहीं अधिक जटिल है (यह यूबी भी ले सकता है)। –

0

तुम भी एक निर्माण के रूप में *(int *)(Address) = value का प्रयोग कर एक valueAddress को assigne और

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