2010-04-21 18 views
6

तो, आप जानते हैं कि किस तरह के प्राचीन प्रकार के 1 बाइट का आकार है? मैं एक कस्टम आकार के साथ एक आदिम कैसे बनाऊंगा? तो 4 बाइट्स के आकार के साथ int में एक की तरह मैं एक आकार के आकार के साथ 16 कहता हूं। क्या ऐसा करने का कोई तरीका है? क्या इसके आसपास कोई रास्ता है?कस्टम बाइट आकार?

+1

आप इसके साथ क्या करना चाहते हैं? क्या यह आपके कंप्यूटेशंस में बड़ी संख्या की अनुमति देता है या क्या आपके 16 बाइट बड़े पूर्णांक के लिए आपकी कोई और योजना है? – Laserallan

+1

यह एक दिलचस्प सवाल है, लेकिन थोड़ा सा अनिर्दिष्ट है। और उत्तर या तो बड़े या छोटे प्राइमेटिव बनाने का पता नहीं लगाते हैं। 'Char' से छोटा: 'ऑपरेटर' को ओवरराइड करें और' std :: वेक्टर :: iterator' में जैसा है। एक 'लंबी int' से बड़ा: एक बिग्नम लाइब्रेरी का उपयोग करें। – Potatoswatter

+0

@ लेज़रलान मैं सी ++ में प्राइमेटिव के साथ गणित के लिए इसका उपयोग करना चाहता हूं कि संख्या सी ++ में मानक प्राइमेटिव की सीमा से बाहर हो जाती है। –

उत्तर

5

आम तौर पर आप केवल एक संरचना बनाते हैं जो उस डेटा का प्रतिनिधित्व करती है जिसमें आप रुचि रखते हैं। यदि यह डेटा के 16 बाइट्स है, या तो यह कई छोटे प्रकारों का कुल है या आप प्रोसेसर पर काम कर रहे हैं जिसमें मूल 16-बाइट अभिन्न प्रकार है।

यदि आप बहुत बड़ी संख्याओं का प्रतिनिधित्व करने की कोशिश कर रहे हैं, तो आपको एक विशेष पुस्तकालय खोजने की आवश्यकता हो सकती है जो मनमाने ढंग से आकार की संख्या को संभालती है।

4

यह इस बात पर निर्भर करता है कि आप ऐसा क्यों कर रहे हैं। आमतौर पर, आप 8 बिट से कम प्रकार के प्रकार का उपयोग नहीं कर सकते हैं, क्योंकि यह वास्तुकला के लिए पता योग्य इकाई है। आप अलग-अलग लंबाई को परिभाषित करने के structs उपयोग कर सकते हैं, हालांकि,:

struct s { 
    unsigned int a : 4; // a is 4 bits 
    unsigned int b : 4; // b is 4 bits 
    unsigned int c : 16; // c is 16 bits 
}; 

हालांकि, वहाँ कोई गारंटी नहीं कि struct 24 बिट लंबे हो जाएगा। इसके अलावा, यह एंडियन मुद्दों का कारण बन सकता है। आप कहां कर सकते हैं, सिस्टम स्वतंत्र प्रकारों का उपयोग करना सबसे अच्छा है, जैसे कि uint16_t, आदि। आप बिटवाई ऑपरेटरों और बिट शिफ्ट का उपयोग विशेष रूप से चीजों को हल करने के लिए भी कर सकते हैं।

+0

uint16_t अभी भी एंडियन मुद्दे हैं। –

+0

@ बिली सच ... मुझे लगता है कि मेरा मुद्दा यह है कि इस संबंध में structs में बिटफील्ड बहुत गन्दा हैं, और यह उनके प्राथमिक उपयोगों में से एक है। – WhirlWind

+0

हां। मैं इसके लिए आपको नीचे नहीं जा रहा था। लेकिन मैंने सोचा कि यह उल्लेखनीय था। –

0

यदि आप एक नया प्रकार बनाना चाहते हैं, तो इसे टाइप करें। यदि आप इसे 16-बाइट आकार में रखना चाहते हैं, तो उस स्ट्रिप टाइप करें जिसमें उसके भीतर 16-बाइट सदस्य डेटा हैं। बस सावधान रहें कि आपके सिस्टम संरेखण आवश्यकताओं से मेल खाने के लिए अक्सर कंपिलर आपके लिए चीजों को पैड करेंगे। एक बाइट स्ट्रक्चर बिना किसी देखभाल के 1 बाइट्स बना रहता है।

1

सी ++ 11 में, इसके लिए एक उत्कृष्ट समाधान है: std :: aligned_storage।

#include <memory> 
#include <type_traits> 

int main() 
{ 
    typedef typename std::aligned_storage<sizeof(int)>::type memory_type; 
    memory_type i; 
    reinterpret_cast<int&>(i) = 5; 
    std::cout << reinterpret_cast<int&>(i) << std::endl; 

    return 0; 
} 

यह आप ढेर पर अप्रारंभीकृत भंडारण के एक ब्लॉक घोषित करने के लिए अनुमति देता है।

+0

प्रश्न के साथ लिंक क्या है? –

+0

@ जेएन। स्पष्ट तथ्य के अलावा कि आपको स्टैक या ढेर पर कस्टम आकार के भंडारण आवंटित करने की इजाजत देने के बाद आप सही तरीकों का उपयोग करके किसी दिए गए पक्ष के कस्टम वर्ग को परिभाषित कर सकते हैं? यह एक आदिम की तरह व्यवहार नहीं कर सकता है, लेकिन यदि आपको एक कस्टम आकार की कक्षा की आवश्यकता है, तो यह उपयोग करने के लिए एक शानदार उपकरण है (यहां तक ​​कि एक कस्टम चौड़ाई पूर्णांक की तरह)। मनमानी डेटा सदस्यों के साथ कस्टम सख्त परिभाषित करने से यह काफी बेहतर है। –