2009-06-15 10 views
12

Delphi supporta da tempo alcuni tipi numerici di base e mi chiedevo in che modo sono correlati l'uno con l'altro.In che modo i tipi base di Delphi sono correlati tra loro?

In Delphi 2007 ho trovato queste dichiarazioni (alcuni sono in conflitto, alcuni sono semplici aliasses):

Types.pas:

DWORD = LongWord; 
Largeint = Int64; 

getmem.inc:

DWORD = Integer; 

Windows. pas:

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

Questo mi porta a pensare che i tipi numerici con segno di base siano SmallInt, Integer e Int64. Senza firma, c'è Byte, WORD e UInt64. Ma qual è la differenza tra Cardinal e LongWord? (A proposito, qual è l'involucro originale e previsto per questi tipi?)

E c'è un tipo per interi a 8 bit con segno (Int8)?

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

Infine, come devo definire int e uint, con particolare riguardo alla C/C++ compatibilità e un interruttore futuro per altre piattaforme (eventualmente anche a 64 bit)? (Una questione collegata è, naturalmente, come farà i vari tipi numerici essere definita in 64 bit di Delphi?)

+1

Grazie per tutti i commenti - quello che ho imparato da questo è che i tipi di base come UInt8 e tutte le varianti dovrebbero essere stati usati come, beh, le basi! Sarebbe bello se una versione futura di Delphi (o FPC) trasformasse le dichiarazioni di tipo in giro, in modo che i tipi non di base siano chiaramente derivati ​​dalle basi. Mi piacerebbe vedere qualcosa di simile in Tipi.pas o System.pas: tipo Intero = {$ IFDEF CPU64} Int64 {$ ELSE} Int32 {$ ENDIF}; Solo i miei 5 centesimi, però. – PatrickvL

risposta

7

Il tipo intero con un byte firmato è ShortInt. Puoi ricordare la sua dimensione dal fatto che è non della stessa dimensione delle solite implementazioni C del tipo short.

Per quanto riguarda la capitalizzazione, inserire la maiuscola nella prima lettera. The documentation tende a lasciare la parte "int" all'estremità in minuscolo, come in Longint, ma penso che sia più comune capitalizzarlo. Non scrivere i tipi in maiuscole a meno che non si utilizzino i tipi di Platform SDK e se si desidera che il codice mostri le sue radici C; altrimenti sarei solo scrivere Word e DWord, Long e ULong, ecc)

Delphi 2009, forse anche prima, definisce già i tipi come Int8 e UInt32. Per quanto riguarda come definire Int e UInt, direi non. La lingua che stai utilizzando definisce già Integer e Cardinal; non introdurre nuovi nomi di tipi quando non è necessario. Conserva i nomi che hai già, e poi tutti gli altri sapranno di cosa stai parlando. (Inoltre, Int è già una funzione nell'unità sistema.)

Usa Cardinal quando si desidera un tipo senza segno e non si cura di sua dimensione; utilizzare LongWord quando la variabile deve essere esattamente quattro byte. Allo stesso modo per Integer e LongInt. Utilizzare Cardinal quando si desidera un tipo senza segno di quattro byte; utilizzare LongWord quando si desidera un tipo non firmato generico e non si preoccupa della dimensione. Allo stesso modo per Integer e LongInt, al giorno d'oggi. Se stai scrivendo il codice a 16 bit, usa LongInt quando hai bisogno di quattro byte e usa Integer quando non ti interessa la dimensione; Cardinal e LongWord non esistevano nei giorni di 16-bit di Delphi e Turbo Pascal.

La saggezza comune per anni era che Integer e Cardinal sarebbero diventati tipi a 64 bit su un compilatore a 64 bit, ma apparentemente non è il caso. Invece, they will remain 32-bit types, proprio come fanno le loro controparti in Microsoft C++. Inoltre, ci sarà un nuovo tipo, NativeInt, che sarà un tipo a 64 bit in un compilatore a 64 bit. I tipi LongInt e LongWord diventeranno tipi a 64 bit perché hanno sempre le stesse dimensioni del tipo Pointer, che era di 32 bit anche in tempi di 16 bit.

+1

"I tipi LongInt e LongWord diventeranno tipi a 64 bit". Questo è stato discusso e non è stato trovato alcun consenso, soprattutto perché sono stati pubblicizzati come tipi di 32 bit non generici dai giorni TurboPASCAL. E Puntatori nel campo 16 bit dove 20 bit grande non 32 bit: "(Seg16 << 4) + Ofs16)" –

+1

I puntatori erano 32 bit nel senso che SizeOf (Puntatore) = 4. Non è mai stato il caso che SizeOf (Puntatore) = 2.5. –

+0

... e il numero intero era di 16 bit in TP. –

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) 

cardinale e integer sono tipi generici. Per 16 bit erano 16 byte di grandi dimensioni e per 32 bit erano 32 bit di grandi dimensioni. Per 64 bit la piattaforma Windows 64 bit (LLP64) li definisce come 32 bit. I nuovi tipi NativeInt e NativeUInt ora sono i tipi di dimensioni del registro della CPU.

+1

Grazie per aver menzionato LLP64, che mi ha portato a questo articolo: http://en.wikipedia.org/wiki/64-bit#Specific_data_models Incredibile quanto roba si può dimenticare ... ;-) – PatrickvL

+0

FPC definisce 64- bit senza segno come QWORD. –

3

Cardinal e Integer sono alias.

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

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

+0

Sbagliato! LongWord = cardinal = DWORD = ** unsigned ** Numero intero a 32 bit, –

+0

Whoops, i nomi intermedi sono stati invertiti (fisso). L'idea esterna è corretta. "Integer" è un alias per un 'Int32',' Cardinal' è un alias per un 'UInt32' (per usare la terminologia .NET più chiara) –

2

per ottenere "l'originale e destinato involucro" premete Ctrl - Spazio, ritorno dopo aver digitato un nome di tipo (vale a dire l'uso completamento del codice).

Problemi correlati