2009-06-15 8 views
12

डेल्फी ने कुछ बुनियादी संख्यात्मक प्रकारों का समर्थन किया है और मैं सोच रहा था कि वे एक-दूसरे से कैसे जुड़े हैं।एक दूसरे से संबंधित मूल डेल्फी प्रकार कैसे हैं?

Types.pas:

DWORD = LongWord; 
Largeint = Int64; 

getmem.inc:

DWORD = Integer; 

विंडोज

डेल्फी 2007 में मैं इन घोषणाओं (कुछ परस्पर विरोधी हैं, कुछ मात्र aliasses कर रहे हैं) मिल गया। पास:

DWORD = Types.DWORD; 
SHORT = Smallint; 
UINT = LongWord; 
ULONG = Cardinal; 
LONGLONG = Int64; 
TLargeInteger = Int64; 
ULONGLONG = UInt64; 

इससे मुझे आधार पर हस्ताक्षर किए गए संख्यात्मक प्रकार छोटे, इंटीजर और Int64 के बारे में सोचने में मदद मिलती है। बिना हस्ताक्षर किए, बाइट, वर्ड और UInt64 है। लेकिन कार्डिनल और लॉन्गवार्ड के बीच क्या अंतर है? (वैसे, इन प्रकारों के लिए मूल और इच्छित आवरण क्या है?)

और क्या हस्ताक्षर 8 बिट पूर्णांक (Int8) के लिए एक प्रकार है?

// Int8 = ?unknown?; 
UInt8 = Byte; 
Int16 = SmallInt; 
UInt16 = Word; 
Int32 = Integer; 
UInt32 = LongWord; 
// Int64 already exists 
// UInt64 already exists 

अन्त में, आई इंट और uint, विशेष रूप से C/C++ संगतता और अन्य प्लेटफार्मों के लिए एक भविष्य स्विच (संभवतः भी 64 बिट) के संबंध में कैसे परिभाषित करना चाहिए? (इससे संबंधित एक सवाल है, जाहिर है, कैसे विभिन्न सांख्यिक प्रकार 64-बिट डेल्फी में परिभाषित किया गया है जाएगा?)

+1

सभी टिप्पणियों के लिए धन्यवाद - मैंने इससे क्या सीखा है, कि मूल प्रकार जैसे UInt8 और सभी प्रकारों का उपयोग मूल रूप से किया जाना चाहिए था! यह अच्छा होगा अगर भविष्य में डेल्फी (या एफपीसी) संस्करण ने इसके प्रकार की घोषणाएं बदल दीं, ताकि मूलभूत मूलभूत रूप से बुनियादी बातों से स्पष्ट रूप से व्युत्पन्न न हो। मैं Type.pas या System.pas: टाइप इंटीजर = {$ IFDEF CPU64} Int64 {$ ELSE} Int32 {$ ENDIF} में ऐसा कुछ देखने की अपेक्षा करता हूं; बस मेरे 5 सेंट, हालांकि। – PatrickvL

उत्तर

7

हस्ताक्षरित एक-बाइट पूर्णांक प्रकार ShortInt है। आप इस तथ्य से अपने आकार को याद कर सकते हैं कि short प्रकार के सामान्य सी कार्यान्वयन के समान आकार के समान आकार है।

पूंजीकरण के लिए, पहले अक्षर को पूंजीकृत करें। The documentation अंत में लोअरकेस पर "int" भाग छोड़ने के लिए जाता है, जैसा कि लॉन्गिन में है, लेकिन मुझे लगता है कि इसे पूंजीकृत करना अधिक आम है। सभी राजधानियों में प्रकारों को तब तक न लिखें जब तक कि आप प्लेटफ़ॉर्म एसडीके प्रकार और का उपयोग नहीं कर रहे हैं, तो आप अपना कोड अपनी सी जड़ें दिखाना चाहते हैं; अन्यथा मैं सिर्फ Word और DWord, Long और ULong, आदि)

लिखते हैं डेल्फी 2009, शायद इससे पहले, पहले से ही Int8 और UInt32 तरह प्रकार परिभाषित करता है। Int और UInt को परिभाषित करने के तरीके के रूप में, मैं कहूंगा कि नहीं है। जिस भाषा का आप उपयोग कर रहे हैं वह पहले से ही Integer और Cardinal को परिभाषित करता है; जब आपको आवश्यकता नहीं है तो नए प्रकार के नाम पेश न करें। आपके पास पहले से मौजूद नाम रखें, और फिर सभी को पता चलेगा कि आप किस बारे में बात कर रहे हैं। (इसके अलावा, Int पहले से ही सिस्टम इकाई में एक समारोह है।)

उपयोग Cardinal आप एक अहस्ताक्षरित प्रकार चाहते हैं और इसके आकार के बारे में परवाह नहीं है जब; LongWord का उपयोग करें जब चर बिल्कुल चार बाइट होना चाहिए। इसी प्रकार Integer और LongInt के लिए। जब आप चार-बाइट हस्ताक्षरित प्रकार चाहते हैं तो Cardinal का उपयोग करें; LongWord का उपयोग करें जब आप एक सामान्य हस्ताक्षरित प्रकार चाहते हैं और आकार की परवाह नहीं करते हैं। इसी प्रकार Integer और LongInt, आजकल के लिए। यदि आप 16-बिट कोड लिख रहे हैं, तो आपको 0 बाइट्स की आवश्यकता होने पर LongInt का उपयोग करें और Integer का उपयोग करें जब आपको आकार की परवाह नहीं है; Cardinal और LongWord डेल्फी और टर्बो पास्कल के 16-बिट दिनों में मौजूद नहीं थे।

वर्षों के लिए सामान्य ज्ञान यह था कि Integer और Cardinal 64-बिट कंपाइलर पर 64-बिट प्रकार बन जाएंगे, लेकिन यह स्पष्ट रूप से मामला नहीं है। इसके बजाय, they will remain 32-bit types, जैसे कि माइक्रोसॉफ्ट सी ++ में उनके समकक्ष। इसके अलावा, एक नया प्रकार होगा, NativeInt, जो 64-बिट कंपाइलर में 64-बिट प्रकार होगा। LongInt और LongWord प्रकार 64-बिट प्रकार बन जाएंगे क्योंकि वे हमेशा Pointer प्रकार के समान आकार के होते हैं, जो 16 बिट्स में भी 32 बिट्स थे।

+1

"द लॉन्गइंट और लॉन्गवार्ड प्रकार 64-बिट प्रकार बन जाएंगे"। ऐसा कुछ है जिस पर चर्चा की गई थी और कोई आम सहमति नहीं मिली, विशेष रूप से क्योंकि उन्हें टर्बोपास्कल दिनों के बाद गैर-जेनेरिक 32 बिट प्रकार के रूप में विज्ञापित किया गया था। और 16 बिट भूमि में पॉइंटर्स जहां 20 बिट बड़ा 32 बिट नहीं है: "(सेग 16 << 4) + ऑफ 16)" –

+1

पॉइंटर्स 32 बिट्स इस अर्थ में थे कि SizeOf (सूचक) = 4. यह कभी भी ऐसा नहीं हुआ है कि SizeOf (सूचक) = 2.5। –

+0

... और टीपी में पूर्णांक 16-बिट था। –

4
UInt8 = Byte 
Int8 = ShortInt 
UInt16 = Word 
Int16 = SmallInt 
UInt32 = LongWord 
Int32 = LongInt 
UInt64 = UInt64 
Int64 = Int64 

int = Integer 
uint = Cardinal 

NativeInt (generic, depends on CPU register size) 
NativeUInt (generic, depends on CPU register size) 

कार्डिनल और पूर्णांक सामान्य प्रकार हैं। 16 बिट के लिए वे 16 बाइट बड़े थे और 32 बिट के लिए वे 32 बिट बड़े थे। 64 बिट के लिए विंडोज 64 बिट प्लेटफ़ॉर्म (LLP64) उन्हें 32 बिट के रूप में परिभाषित करता है। नया मूल INT और NativeUInt प्रकार अब CPU रजिस्टर आकार के प्रकार हैं।

+1

एलएलपी 64 का उल्लेख करने के लिए धन्यवाद, जिसने मुझे इस लेख का नेतृत्व किया: http://en.wikipedia.org/wiki/64-bit#Specific_data_models आश्चर्यजनक है कि कोई कितना सामान भूल सकता है ... ;-) – PatrickvL

+0

एफपीसी 64- बिट QWORD के रूप में हस्ताक्षरित। –

3

कार्डिनल और इंटीजर उपनाम हैं।

Cardinal ==> LongWord (unsigned) 
Integer ==> LongInt (signed) 

http://i38.tinypic.com/9s5ufc.jpg

+0

गलत! LongWord = cardinal = DWORD = ** हस्ताक्षरित ** 32-बिट पूर्णांक, –

+0

हूप्स, मध्यवर्ती नामों को उलट दिया गया (निश्चित)। बाहरी विचार सही है 'इंटेगर'' इंट 32 'के लिए उपनाम है,' कार्डिनल ''UInt32' के लिए उपनाम है (स्पष्ट .NET शब्दावली का उपयोग करने के लिए) –

2

मिल "मूल और इरादा आवरण" प्रेस Ctrl करने के लिए - अंतरिक्ष, वापसी के बाद आप एक प्रकार का नाम (अर्थात उपयोग कोड पूर्णता) टाइप किया है।

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

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