Entwickler-Ecke

Alle Sprachen - Alle Plattformen - Was ist ein long in C und C++


Delete - Di 22.08.17 22:48
Titel: Was ist ein long in C und C++
- Nachträglich durch die Entwickler-Ecke gelöscht -


Ralf Jansen - Di 22.08.17 23:15

Unter 32 bit ist long = int. Bei 64bit Systemen kommt es auf OS/Compiler/Compilereinstellungen an.
Unter Windows und einem Microsoft Compiler ist auch bei 64bit OS long = int = 32bit. Unter *nix OS'en ist long eher gleich long long also 64bit.

Zitat:
Was stimmt nun?


Alles was du gefunden hast ist im richtigen Kontext vermutlich richtig.


Delete - Di 22.08.17 23:34

- Nachträglich durch die Entwickler-Ecke gelöscht -


Th69 - Mi 23.08.17 09:08

Die Tabelle listet nur auf, was man in C oder C++ angeben kann, um einen bestimmten Datentyp zu definieren, d.h.

C
1:
2:
3:
4:
signed long int a;
signed long     b;
long int        c;
long            d;

definieren alle einen "long int" (es gibt auch noch den Datentyp "long double", d.h. "long" ist sprachtechnisch gesehen nur ein "qualifier" (zusätzliches Kennzeichen)).

Hinzu kommt, daß der C und C++ Sprachstandard jeweils nur Mindestgrößen für die Datentypen vorgibt:

Quelltext
1:
2:
3:
4:
short     >= 16 bit (2 Byte)
int       >= 16 bit (2 Byte)
long      >= 32 bit (4 Byte)
long long >= 64 bit (8 Byte)

Jeder Compilerhersteller definiert dann für sich die entsprechenden Datengrößen (welche möglichst passend zum Prozessor sind, um möglichst effizienten Code zu erzeugen).

Und bei dem Code der Library wird eben anhand des Makros __x86_64__ festgelegt, wie die beiden Aliasnamen uint32 und int32 definiert sind (d.h. auf welchen konkreten Datentypen diese beruhen).
Wenn du also eine DLL in Delphi ansprechen willst, dann mußt du genau wissen, mit welchem Compiler (und dessen Einstellung x86 oder x64) diese kompiliert wurde.

Bei deiner Library kannst du also wegen der Namen davon ausgehen, daß die beiden Datentypen einen 32-Bit Integer verwenden (egal ob für x86 oder x64 kompiliert).

PS: "C/C++" gibt es nicht ;-)


Delete - Mi 23.08.17 10:02

- Nachträglich durch die Entwickler-Ecke gelöscht -


Tastaro - Mi 23.08.17 11:04

Da fällt mir immer diese uralte Frage ein:

Was ist der Unterschied zwischen einem Pascal- und einem C-Programmierer?

Der Pascal-Programmierer weiß wie lang seine Datentypen sind. :)


Symbroson - So 08.10.17 21:29

user profile iconTastaro hat folgendes geschrieben Zum zitierten Posting springen:
Da fällt mir immer diese uralte Frage ein:

Was ist der Unterschied zwischen einem Pascal- und einem C-Programmierer?

Der Pascal-Programmierer weiß wie lang seine Datentypen sind. :)


Dem muss ich wiedersprechen.
speziell für integer kannst du stdint.h importieren - da weiß man nachher immer wie groß die sind - egal auf welcher Plattform. Im zweifelsfall sizeof(type) ausgeben.

Und ich bezweifle sehr stark dass pascal Programmiere im Schnitt die Datentypengröße besser kennen als c bzw. c++ programmierer.

bei Java kann ich mir das vorstellen, aber das kann und will ich vorerst nicht verstehen, geschweigedenn lernen.
Bin halt ein typischer Linux-Fan :p

LG


OlafSt - Mo 09.10.17 00:05

Och, in Pascal ist das ziemlich streng formuliert.

ShortInt = 8 Bit Signed, int8 als Alias
Byte = 8 Bit unsigned, UInt8 als Alias
SmallInt = 16 Bit signed, Int16 als Alias
Word = 16 Bit Unsigned, UInt16 als Alias
Integer = 32 Bit signed, Int32 oder auch LongInt als Alias
Cardinal = 32 Bit unsigned, UInt32 oder auch LongWord als Alias
int64 = 64 Bit signed
UInt64 = 64Bit unsigned

Es gibt aber einen Typen, bei dem es vom System abhängt: NativeInt bzw. NativeUInt. Der ist 32bittig unter 32bit-Systemen und 64bittig unter 64-Bit-Systemen.


Symbroson - Mo 09.10.17 03:43

in c ist es ähnlich:
char: 1B
short: 2B
int: 4B | (16bit)2B
long: 4B
long long: 8B

float: 4B
double: 8B
long double: 10B

pointer: 4B

mit stdint.h tragen die Typen ihre Größe im Namen und sind Plattformunabhängig
intx_t / uintx_t wobei x=8,16,32,64

[Edit] also ich hab jetzt doch nochmal nachgeschaut und folgenden Thread gefunden, der deine Aussage leider bestätigt :roll: : https://stackoverflow.com/questions/32924398/difference-between-short-long-and-long-long-int-in-c-programming

Absr wie gesagt - zur Not sizeof(type) - dann kann einen nichts überraschen oder fleich stdint.h


Delete - Di 10.10.17 08:17

- Nachträglich durch die Entwickler-Ecke gelöscht -


OlafSt - Di 10.10.17 09:12


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
type
  {$IFDEF WIN32}
  NativeInt = integer;
  NativeUInt = Cardinal;
  {$ELSE}
  NativeInt = int64;
  NativeUInt = UInt64;
  {$ENDIF}


So ungefähr.


hydemarie - Di 10.10.17 10:55

user profile iconSymbroson hat folgendes geschrieben Zum zitierten Posting springen:
in c ist es ähnlich:
char: 1B


Wobei du natürlich, wenn du schon Plattformunabhängigkeit als Vorteil von irgendwas nennst, daran denken solltest, dass du außer stdint.h auch limits.h einbindest und mit CHAR_BIT statt mit "Byte" (denn das ist keine Konstante) rechnest... ;)


Delete - Mi 11.10.17 15:46

- Nachträglich durch die Entwickler-Ecke gelöscht -