मैं float
को int
के रूप में टाइप करना चाहता हूं। हालांकि, यह बिट कॉपी द्वारा थोड़ा सा नहीं करता है। क्या सभी बिट्स (साइन, एक्सपोनेंट, मंटिसा) को बनाए रखते हुए float
को int
में टाइप करना संभव है?बिट कॉपी द्वारा टाइपकास्टिंग
उत्तर
अधिकांश भाषाओं सी में यह की तरह है, ऐसा ही कुछ अनुमति देते हैं:
float f = 3.14f;
int i = *(int*)&f;
यह अद्भुत है! वास्तव में मैं क्या देख रहा हूँ! –
हालांकि अधिकांश मामलों में यह बहुत अच्छी तरह से काम कर सकता है, यह जीसीसी में एक चेतावनी ट्रिगर करता है क्योंकि यह सख्त-एलियासिंग का उल्लंघन करता है - जो तकनीकी रूप से अपरिभाषित व्यवहार है। – Mysticial
यह दिलचस्प है - इसने मेरे जीसीसी (4.4.3) में चेतावनी नहीं उठाई? –
यह एक पूरी तरह से सी-संगत तरीके से ऐसा करना संभव नहीं है, लेकिन आप यूनियनों इस्तेमाल कर सकते हैं:
union{
int i;
float f;
} u;
u.f = 123.456; // Your value.
// Read u.i.
यह अभी भी आज लगभग सभी सिस्टम पर काम करना चाहिए। और निश्चित रूप से मानता है कि float
और int
समान आकार हैं।
विकल्प पॉइंटर कास्टिंग का उपयोग करना है, लेकिन कड़ाई से बोलना, जो सख्त-एलियासिंग का उल्लंघन करता है और इसे अनिर्धारित व्यवहार माना जाता है।
एक और (संभवतः अनुरूप - टिप्पणी देखें) दृष्टिकोण memcpy()
उपयोग करने के लिए है:
int i;
float f;
f = 123.456; // Your value.
memcpy(&i, &f, sizeof(int));
// Read i
मेरा मानना है कि यह अनिर्दिष्ट व्यवहार है (जिसे आप अपनी पहली वाक्य में उल्लिखित करते हैं)। सी 99 के परिशिष्ट जे 1 में कहा गया है "निम्नलिखित निर्दिष्ट नहीं हैं: ... पिछले एक के अलावा संघीय सदस्य का मूल्य"। अनसुलझा कार्यान्वयन-परिभाषित और अपरिभाषित व्यवहार के बीच बैठता है - कार्यान्वयन को यह दस्तावेज नहीं करना पड़ता है कि परिणाम क्या हैं, इस बारे में एक विकल्प कैसे बनाया जाता है। फिर भी, ऐसा कोई अन्य (सभी-सी) नहीं है - ऐसा करने के लिए सुरक्षित तरीका +1। – paxdiablo
लेकिन जहां तक मुझे पता है कि जीसीसी गारंटी देता है कि यूनियनों के माध्यम से पनिंग टाइप करना इसके साथ काम करता है, इसलिए यदि इसे पोर्टेबल नहीं होना चाहिए, तो यह ठीक है। –
memcpy के बारे में क्या? –
आप कर सकते हैं union का उपयोग करें।
union
{
int tmp;
float f;
} u;
u.f = z;
फिर u.tmp
समान बिट्स है। (कोड this Wikipedia article से लिया गया)।
- 1. टाइपकास्टिंग समस्याएं, ===
- 2. कॉपी शब्दकोश मान द्वारा
- 3. ऑब्जेक्ट टाइपकास्टिंग का प्रदर्शन
- 4. PHP टाइपकास्टिंग - अच्छा या बुरा?
- 5. सी बिट ऑपरेशंस/एक बाइट से दूसरे बाइट में एक बिट कॉपी करें
- 6. जावा में बिट द्वारा एक पूर्णांक बिट कैसे पढ़ सकता है?
- 7. 64-बिट बनाम 32-बिट विंडोज
- 8. सी ++ 64 बिट int: संदर्भ द्वारा पास या मूल्य
- 9. कॉपी
- 10. क्या सी ++ कंपाइलर्स कॉपी द्वारा पारित संदर्भ पीओडी पैरामीटर द्वारा पास ऑप्टिमाइज़ करते हैं?
- 11. 32 बिट और 64 बिट अप्रबंधित DLL
- 12. लिनक्स पर नया से सी प्रोग्रामिंग, टाइपकास्टिंग पर अटक गया
- 13. कॉपी बनाम गहरी कॉपी: सेमेन्टिक्स
- 14. कॉपी फ़ाइलों
- 15. 32-बिट या 64-बिट एप्लिकेशन?
- 16. 32 बिट बनाम 64 बिट
- 17. बिट ऐरे समानता
- 18. 32-बिट मेमोरी और 32-बिट प्रोसेसर
- 19. गैर कॉपी करने istringstream
- 20. स्कैला कॉपी() विषम व्यवहार
- 21. 32 बिट int * 32 बिट int = 64 बिट int?
- 22. ऑब्जेक्ट.क्लोन() द्वारा किया गया यह फ़ील्ड-बाय-फील्ड कॉपी क्या है?
- 23. कॉपी या कॉपी ओवरराइड WithZone: या दोनों?
- 24. एनएसएसटींग कॉपी कॉपी नहीं कर रहा है?
- 25. सीधे पायथन में पोस्टग्रेस कॉपी कॉपी करना?
- 26. बिट क्षेत्रों
- 27. स्कैला कॉपी ऑब्जेक्ट्स
- 28. क्या यह त्रुटि 32-बिट JVM में चल रहे जावा प्रोग्राम द्वारा 64-बिट लाइब्रेरी तक पहुंचा जा रहा है?
- 29. कॉपी निर्माता
- 30. कॉपी चरण
यह केवल तभी काम कर सकता है जब आकार (फ्लोट) <= sizeof (int) '। अगर भाषा की गारंटी है तो मुझे जवाब के लिए गुगलिंग की तरह महसूस नहीं होता है। –