2013-08-06 4 views
5

मैं कोड की निम्न पंक्ति के बारे में एक ई-मेल के माध्यम से तर्क पढ़ रहा हूँ:क्या एएनएसआई सी वास्तव में निर्दिष्ट करता है कि छोटे पूर्णांक को टाइपकास्टिंग करते समय कौन से बाइट्स का उपयोग किया जाता है?

p = (unsigned char)random(); 

यादृच्छिक समारोह एक लंबे देता है, और किसी का कहना है कि इस वजह से यह संभव है असुरक्षित है कि समान किरदार MSB ले के बजाय हो सकता है एलएसबी मुझे पता है कि x86 पर टाइपकास्ट एलएसबी वापस कर देगा, लेकिन मुझे यह जानकारी नहीं मिल सकती है कि यह वास्तव में एएनएसआई सी द्वारा अनिवार्य है या नहीं, या यह उन कार्यान्वयन-विशिष्ट "अपरिभाषित व्यवहार" में से एक है।

+1

प्रश्न दिलचस्प है और जानने के लायक उत्तर है, लेकिन वास्तविक कोड में, किसी को भ्रम को दूर करने का प्रयास करना चाहिए। दूसरे शब्दों में, यदि आप इस पर कोड बदलते हैं, तो बाइट का उपयोग करने के बारे में कोई सवाल नहीं है: 'p = (unsigned char) (यादृच्छिक()% 256)'। यह आपके कोड के भविष्य के पाठक को एक ही चीज़ पर आश्चर्यचकित करने से रोक देगा। एक सामान्य नियम के रूप में, आपको कोड नहीं लिखना चाहिए जो समझने के मानकों के विवरणों के विस्तृत ज्ञान पर निर्भर करता है। –

+0

वास्तव में कलाकार अनावश्यक है; आप किसी भी संख्यात्मक प्रकार को किसी अन्य संख्यात्मक प्रकार में असाइन कर सकते हैं, और इसे पूरी तरह से एक कलाकार द्वारा रूपांतरित किया जाएगा। –

+0

@ किथ थॉम्पसन: संकलक चेतावनी दे सकते हैं कि संभावित रूप से हानिकारक रूपांतरण का उपयोग बिना किसी कलाकार के किया जाता है, हालांकि ... – Christoph

उत्तर

6

यह सी मानक में निर्दिष्ट है।

6.3.1.3p2 में C99 का कहना है:

"अन्यथा, यदि नए प्रकार अहस्ताक्षरित है, मूल्य बार-बार जोड़ने या अधिकतम मूल्य है कि नए में दर्शाया जा सकता है एक से अधिक घटा कर बदल जाती है जब तक मान नए प्रकार की सीमा में न हो तब तक टाइप करें। "

दो पूरक प्रणाली पर, इसका मतलब है कम से कम महत्वपूर्ण बिट्स लेना।

+0

लेकिन * * हस्ताक्षरित * प्रकार में रूपांतरण के लिए, यदि लक्ष्य प्रकार मान का प्रतिनिधित्व नहीं कर सकता है तो परिणाम कार्यान्वयन-परिभाषित है (या यह कार्यान्वयन-परिभाषित सिग्नल बढ़ा सकता है, लेकिन मुझे ऐसा कोई संकलक नहीं है जो ऐसा करता है)। –

+0

@ किथ थॉम्पसन: कार्यान्वयन के दस्तावेज़ीकरण को व्यवहार का वर्णन करने के लिए कितनी सटीकता है? एक कार्यान्वयन वैध रूप से निर्दिष्ट कर सकता है कि 16-बिट हस्ताक्षरित प्रकार को सीधे निर्दिष्ट करने के लिए सीमा -32768..32767 के बाहर एक मान एन को एन + 65536 * __ INDETERMINATE_VALUE के रूप में व्यवहार करेगा, लेकिन यह एक हस्ताक्षरित 16-बिट पर एक स्पष्ट टाइपकास्ट होगा प्रकार कैनोलिक प्रतिनिधित्व स्टोर करेगा? – supercat

+0

@supercat: किसी भी मामले में, एक रूपांतरण है; एक कलाकार ("टाइपकास्ट" नहीं) केवल वही रूपांतरण निर्दिष्ट करता है जो कास्ट की अनुपस्थिति में पूरी तरह से किया गया होता। मुझे लगता है कि 'int n = too_big;' बनाम 'int n = (int) too_big; '। किसी भी * सायन * कार्यान्वयन में, दोनों रूपांतरण एक ही परिणाम प्राप्त करेंगे, और मुझे संदेह है कि मानक समिति ने माना कि यह मामला है। लेकिन मुझे लगता है कि शब्द कुछ विग्गल रूम छोड़ देता है: "... या तो परिणाम कार्यान्वयन-परिभाषित या कार्यान्वयन-परिभाषित संकेत उठाया गया है।" (एन 1570 6.3.1.3p3) –

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

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