2011-12-09 12 views
5

मैं float को int के रूप में टाइप करना चाहता हूं। हालांकि, यह बिट कॉपी द्वारा थोड़ा सा नहीं करता है। क्या सभी बिट्स (साइन, एक्सपोनेंट, मंटिसा) को बनाए रखते हुए float को int में टाइप करना संभव है?बिट कॉपी द्वारा टाइपकास्टिंग

+0

यह केवल तभी काम कर सकता है जब आकार (फ्लोट) <= sizeof (int) '। अगर भाषा की गारंटी है तो मुझे जवाब के लिए गुगलिंग की तरह महसूस नहीं होता है। –

उत्तर

3

अधिकांश भाषाओं सी में यह की तरह है, ऐसा ही कुछ अनुमति देते हैं:

float f = 3.14f; 
int i = *(int*)&f; 
+0

यह अद्भुत है! वास्तव में मैं क्या देख रहा हूँ! –

+0

हालांकि अधिकांश मामलों में यह बहुत अच्छी तरह से काम कर सकता है, यह जीसीसी में एक चेतावनी ट्रिगर करता है क्योंकि यह सख्त-एलियासिंग का उल्लंघन करता है - जो तकनीकी रूप से अपरिभाषित व्यवहार है। – Mysticial

+0

यह दिलचस्प है - इसने मेरे जीसीसी (4.4.3) में चेतावनी नहीं उठाई? –

4

यह एक पूरी तरह से सी-संगत तरीके से ऐसा करना संभव नहीं है, लेकिन आप यूनियनों इस्तेमाल कर सकते हैं:

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 
+0

मेरा मानना ​​है कि यह अनिर्दिष्ट व्यवहार है (जिसे आप अपनी पहली वाक्य में उल्लिखित करते हैं)। सी 99 के परिशिष्ट जे 1 में कहा गया है "निम्नलिखित निर्दिष्ट नहीं हैं: ... पिछले एक के अलावा संघीय सदस्य का मूल्य"। अनसुलझा कार्यान्वयन-परिभाषित और अपरिभाषित व्यवहार के बीच बैठता है - कार्यान्वयन को यह दस्तावेज नहीं करना पड़ता है कि परिणाम क्या हैं, इस बारे में एक विकल्प कैसे बनाया जाता है। फिर भी, ऐसा कोई अन्य (सभी-सी) नहीं है - ऐसा करने के लिए सुरक्षित तरीका +1। – paxdiablo

+0

लेकिन जहां तक ​​मुझे पता है कि जीसीसी गारंटी देता है कि यूनियनों के माध्यम से पनिंग टाइप करना इसके साथ काम करता है, इसलिए यदि इसे पोर्टेबल नहीं होना चाहिए, तो यह ठीक है। –

+0

memcpy के बारे में क्या? –

2

आप कर सकते हैं union का उपयोग करें।

union 
{ 
    int tmp; 
    float f; 
} u; 

u.f = z; 

फिर u.tmp समान बिट्स है। (कोड this Wikipedia article से लिया गया)।

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