2012-07-16 16 views
5

के फ्लोट आकार को सुनिश्चित करने के लिए मुझे एक क्रॉस-आर्किटेक्चर तरीका चाहिए ताकि यह सुनिश्चित किया जा सके कि एक फ्लोट 4 बाइट्स (जैसा कि 32-बिट विंडोज़ पर है) होगा। उदाहरण के लिए, मैं बनाए गए structs में, मैं int के बजाय का उपयोग कर रहा हूं ताकि 4 बाइट लंबा एक पूर्णांक मान सुनिश्चित किया जा सके।सी ++ 4 बाइट्स

मैं इसे एक फ्लोट के साथ कैसे कर सकता हूं? मुझे पता है कि मैं सिर्फ प्रकार के साथ मान को प्रतिस्थापित कर सकता हूं; हालांकि, 64-बिट सिस्टम पर एक फ्लोट पर कास्टिंग करते समय, क्या मुझे कोई समस्या नहीं होगी?

+5

मानक यह भी गारंटी नहीं देता कि 4-बाइट 'फ्लोट' मौजूद है। हालांकि मैं कल्पना करता हूं कि एक आर्किटेक्चर ढूंढना बेहद मुश्किल होगा जहां 'आकार (फ्लोट)! = Sizeof (int32_t) '। – Mysticial

+2

मेरे पास बुरी खबर है: '__int32' क्रॉस-प्लेटफॉर्म नहीं है। –

+4

* इसके अलावा *: '__int32' प्रत्येक (या किसी भी) प्रणाली पर मौजूद होने की गारंटी नहीं है। इसके बजाए 'int32_t' आज़माएं। –

उत्तर

7

मैं एक क्रॉस-वास्तुकला तरीके की आवश्यकता सुनिश्चित करने के लिए एक है कि फ्लोट 4 बाइट्स

फ़्लोटिंग-पॉइंट मानों के लिए int32_t पर कोई एनालॉग नहीं है।

जो भी आप चाहते हैं उसे हासिल करने के लिए एकमात्र क्रॉस-प्लेटफार्म तरीका रनटाइम या स्थैतिक आवेषण के साथ परीक्षण करना है।

#include <cassert> 
int main() { 
    assert(sizeof(float) == 4); 
    // If control reaches this line, then you've 
    // ensured that float is 4 bytes. 


    // rest of your program goes here 
} 
+2

यदि आकार 4 बाइट्स नहीं है तो यह प्रोग्राम को मारता है .. – Qix

+0

दाएं। यदि आप 'फ्लोट' 4 बाइट्स नहीं हैं तो आप क्या करना चाहते थे? –

+0

मुझे * फ्लोट 4 बाइट्स की आवश्यकता है। – Qix

3

ऐसा करने का एक मानक अनुपालन तरीका नहीं है क्योंकि फ्लोटिंग पॉइंट डेटा आकार सीपीयू से जुड़ा हुआ है। IEEE-754 मानक (जो सभी प्रोसेसर जो मेरे ज्ञान के लिए फ़्लोटिंग पॉइंट का उपयोग करते हैं) एक-परिशुद्धता फ्लोटिंग पॉइंट मान को 4-बाइट्स के रूप में परिभाषित करता है।

मानक उल्लेख नहीं होने का कारण यह है कि सी के लेखक मानक परिवर्तन या अद्यतन होने पर फ़्लोटिंग पॉइंट के विशिष्ट कार्यान्वयन से खुद को जोड़ना नहीं चाहते हैं। और यह भी क्योंकि सीपीयू एकल और डबल परिशुद्धता के आकार और कार्यान्वयन को निर्धारित करता है, इसलिए यह ऐसा कुछ नहीं है जो संकलक स्वयं के साथ चिंता करे।

यदि आप इसके बारे में चिंतित हैं, तो आप sizeof(float) == 4 सुनिश्चित करने के लिए static_assert का उपयोग कर सकते हैं; हालांकि, यह कोई समस्या नहीं है जिसे आप चलाने जा रहे हैं, मैं कल्पना नहीं करूंगा। और यदि आप एक मामला-दर-मामला आधार पर इसके साथ सौदा अगर यह होता है चाहिए (जो वास्तव में एक वास्तुकला-दर-वास्तुकला आधार होने जा रहा है।)

+0

के बीच चयन करने का विकल्प दिया है, जो समझ में आता है। मुझे आईईईई -754 मानक पर और अधिक पढ़ना होगा (हर कोई हमेशा इन मानकों के चारों ओर फेंकता है लेकिन मैं अभी भी यह समझने की कोशिश कर रहा हूं कि वे क्या हैं और वे एक-दूसरे से कैसे जुड़ते हैं)। – Qix

+0

यदि आप अभी भी आसपास हैं, तो आपको शायद रोब-फाई को स्वीकार्य उत्तर देना चाहिए। मैंने बस उसके जवाब से विस्तार किया। – OmnipotentEntity