Unterschiedliche Größe Datentypen

Für Fragen von Einsteigern und Programmieranfängern...
Antworten
matthias95
Beiträge: 2
Registriert: So 20. Mai 2012, 06:12

Unterschiedliche Größe Datentypen

Beitrag von matthias95 »

Hallo,

ich habe ein kleines Problem. Und zwar soll ich für die Schule ein Referat über die Datentypen in Free Pascal/Lazarus halten. Ich soll in einer Tabelle die Datenypen mit ihrem Werteberreich und ihrer Größe eintragen. Das hab ich soweit schon mal erledigt, mein Problem aber ist, dass ich nicht weiß wie der werteberrech mit der Größe zusammenhängt. Weil z.B. beim Typ ShortInt beträgt der Werteberreich -128 bis 127 und beim Typ Binary geht der Berreich von 1 bis 32767 und beide Typen haben dieselber Größe (1 Byte) :?: . Ich versteh jetzt nicht wieso diese Typen diesselbe Größe haben können, denn der ShortInt besitzt 2^8 Zahlen und Binary hat 2^15 Zahlen, was ja doch ein großer unterschied ist. Liegt es vielleicht dadran das ShortInt nur z.B. 4 Bit groß ist und es auf 1 Byte ,,aufgerundet'' wurde und Binary dann z.B. 8 bit Größe hat ??.Ich hoffe das ihr mir helfen könnt und mir erklären könnt wie sich diese Größen zusamensetzten.

lg Matthias

mse
Beiträge: 2013
Registriert: Do 16. Okt 2008, 10:22
OS, Lazarus, FPC: Linux,Windows,FreeBSD,(MSEide+MSEgui 4.6,git master FPC 3.0.4,fixes_3_0)
CPU-Target: x86,x64,ARM

Re: Unterschiedliche Größe Datentypen

Beitrag von mse »

matthias95 hat geschrieben:Weil z.B. beim Typ ShortInt beträgt der Werteberreich -128 bis 127 und beim Typ Binary geht der Berreich von 1 bis 32767 und beide Typen haben dieselber Größe (1 Byte) :?
Bist du sicher? Die FPC Ganzzahl-Datentypen sind hier beschrieben:
http://www.freepascal.org/docs-html/ref ... 260003.1.1
Ein Typ "Binary" findet sich da nicht. Woher hast du die Definition des "Binary" Datentyps?

Martin

Heinrich Wolf
Beiträge: 323
Registriert: Di 12. Apr 2011, 13:21
OS, Lazarus, FPC: WinXP + VMWare Player mit Fedora14, L 1.1, FPC 2.7.1
CPU-Target: 1core 1,8GHz 32Bit
Wohnort: Fürth
Kontaktdaten:

Re: Unterschiedliche Größe Datentypen

Beitrag von Heinrich Wolf »

Hallo,

nach dem zu urteilen, was Du geschrieben hast, glaube ich, Du hast noch nicht ganz verstanden, wie die Größe mit dem Wertebereich zusammenhängt. Bei den Ganzzahl Datentypen ist es noch relativ einfach. Die Größe ist immer eine ganze Anzahl von Bytes, also Vielfache von 8 Bit. Bei den vorzeichenlosen Ganzzahl Datentypen ergibt das bei n = m * 8 Bit einen Wertebereich von 0 bis 2 hoch n - 1. Bei den vorzeichenbehafteten Ganzzahl Datentypen kann man von der 0 ausgehend bis + (2 hoch (n-1)) - 1 zählen. Das höchste Bit ist dabei immer 0. Und beim Zählen ins Negative ist das höchste Bit immer 1. Man kann dabei bis - (2 hoch (n-1)) zählen. Das höchste Bit ist also das Vorzeichen.

Der Link, den mse Dir gegeben hat, nennt 2 Möglichkeiten bei Integer (2 oder 4 Byte). Das liegt daran, dass es Lazarus für mehrere Platformen gibt. Bei Linux und Windows hat Integer in beiden Fällen 4 Byte. Es gibt aber noch mehr Platformen und bei welcher Lazarus Platform Integer 2 Byte hat weiß ich nicht. Ein Vorläufer von Lazarus ist Borland Delphi 1. Das hat 2 Byte für Integer.

Wahrscheinlich erwartet Dein Lehrer, dass Du auch etwas zu Fließkomma Datentypen vorträgst. Siehe dazu
http://www.freepascal.org/docs-html/ref ... 310003.1.2
Auch diese belegen immer Vielfache von 8 Bit. Alles andere wäre Platzverschwendung. Aber die Bits werden außer bei Comp und Currency in zwei Gruppen und das Vorzeichen aufgeteilt, wobei die Gruppen nicht unbedingt Vielfache von 8 Bit sind. Eine Gruppe ist für die Mantisse, die andere Gruppe für den Exponenten. Die Mantisse ist dabei normiert, so dass vor dem Komma eine gedachte 1 steht, die normalerweise nicht abgespeichert wird. Sie besteht aus den Bits 2 hoch -1, 2 hoch -2, ... Daraus ergibt sich die Genauigkeit (signifikante Stellenzahl). Der Exponent hat meistens einen Wertebereich unsymmetrisch zur 0. Fließkommazahl = +/- Mantisse * 2 hoch (Exponent - Exponent Verschiebung zur 0). Durch die binäre Darstellung lassen sich die Dezimalzahlen fast nie exakt darstellen. Dezimal 0,1 ist z.B. ein unendlicher binärer Bruch. Bei Vergleichen muss man daher beachten:

Code: Alles auswählen

var x, y : real;
if x = y then
  writeln('Glück gehabt')
else
  writeln('Du landest hier, obwohl Du das nicht erwartest');
if abs(x - y) < 1e-10 then
  writeln('Das zählt als gleich')
else
  writeln('Das zählt als ungleich');
Siehe auch http://de.wikipedia.org/wiki/Flie%C3%9Fkomma

In der Finanzmathematik sind die Rundungsfehler aus der binären Darstellung ein großes Problem. Daher gibt es den Festkomma Datentyp Currency. Das ist ein Integer mit dem gedachten Exponenten 10 hoch - 4. Abgesehen von Lazarus gibt es auch BCD Zahlen. Dabei steckt man zwei Dezimalziffern in je 4 Bit eines Bytes. Man verschwendet also etwas Speicher. Dafür arbeiteten Berechnungen ebenso exakt wie in unserem menschlichen Zehnersystem.

Gruß
Heiner
Zuletzt geändert von Heinrich Wolf am So 20. Mai 2012, 14:24, insgesamt 1-mal geändert.

mse
Beiträge: 2013
Registriert: Do 16. Okt 2008, 10:22
OS, Lazarus, FPC: Linux,Windows,FreeBSD,(MSEide+MSEgui 4.6,git master FPC 3.0.4,fixes_3_0)
CPU-Target: x86,x64,ARM

Re: Unterschiedliche Größe Datentypen

Beitrag von mse »

Heinrich Wolf hat geschrieben:Hallo,

nach dem zu urteilen, was Du geschrieben hast, glaube ich, Du hast noch nicht ganz verstanden, wie die Größe mit dem Wertebereich zusammenhängt. Bei den Ganzzahl Datentypen ist es noch relativ einfach. Die Größe ist immer eine ganze Anzahl von Bytes, also Vielfache von 8 Bit. Bei den vorzeichenlosen Ganzzahl Datentypen ergibt das bei n = m * 8 Bit einen Wertebereich von 0 bis 2 hoch n.
Nicht 0 bis ( 2^n)-1?
Bei den vorzeichenbehafteten Ganzzahl Datentypen kann man von der 0 ausgehend bis + (2 hoch (n-1)) - 1 zählen.
Das höchste Bit ist dabei immer 0. Und beim Zählen ins Negative ist das höchste Bit immer 1. Man kann dabei bis - (2 hoch (n-1)) zählen. Das höchste Bit ist also das Vorzeichen.
Der Wertebereich ist also -(2^(n-1)) bis 2^(n-1) - 1. Dieses binäre Zahlensystem nennt sich "zweier-Komplement".
Der Link, den mse Dir gegeben hat, nennt 2 Möglichkeiten bei Integer (2 oder 4 Byte). Das liegt daran, dass es Lazarus für mehrere Platformen gibt. Bei Linux und Windows hat Integer in beiden Fällen 4 Byte. Es gibt aber noch mehr Platformen und bei welcher Lazarus Platform Integer 2 Byte hat weiß ich nicht. Ein Vorläufer von Lazarus ist Borland Delphi 1. Das hat 2 Byte für Integer.
Integer ist 16 Bit im TurboPascal Compiler-Modus, dies ist Platform unabhängig.

Heinrich Wolf
Beiträge: 323
Registriert: Di 12. Apr 2011, 13:21
OS, Lazarus, FPC: WinXP + VMWare Player mit Fedora14, L 1.1, FPC 2.7.1
CPU-Target: 1core 1,8GHz 32Bit
Wohnort: Fürth
Kontaktdaten:

Re: Unterschiedliche Größe Datentypen

Beitrag von Heinrich Wolf »

mse hat geschrieben:
Heinrich Wolf hat geschrieben:Hallo,

nach dem zu urteilen, was Du geschrieben hast, glaube ich, Du hast noch nicht ganz verstanden, wie die Größe mit dem Wertebereich zusammenhängt. Bei den Ganzzahl Datentypen ist es noch relativ einfach. Die Größe ist immer eine ganze Anzahl von Bytes, also Vielfache von 8 Bit. Bei den vorzeichenlosen Ganzzahl Datentypen ergibt das bei n = m * 8 Bit einen Wertebereich von 0 bis 2 hoch n.
Nicht 0 bis ( 2^n)-1?
Tut mir leid. Du hast recht! Ich ändere das auch oben.

Heiner

Heinrich Wolf
Beiträge: 323
Registriert: Di 12. Apr 2011, 13:21
OS, Lazarus, FPC: WinXP + VMWare Player mit Fedora14, L 1.1, FPC 2.7.1
CPU-Target: 1core 1,8GHz 32Bit
Wohnort: Fürth
Kontaktdaten:

Re: Unterschiedliche Größe Datentypen

Beitrag von Heinrich Wolf »

Hi,

ich hab ein kleines Programm gemacht, mit dem Du die Darstellung von Zahlen im Speicher untersuchen kannst. Den Quellcode liefere ich erst mal nicht ab, weil ich nicht Deine gesamte Hausaufgabe machen möchte. Nur soviel: Im Programm ist ein

Code: Alles auswählen

var
  Converter : Record
    case Byte of
       0 : (i   : Integer);
       1 : (shi : Shortint);
       2 : (smi : SmallInt);
       3 : (li  : Longint);
       4 : (lw  : Longword);
       5 : (i64 : Int64);
       6 : (b   : Byte);
       7 : (w   : Word);
       8 : (ca  : Cardinal);
       9 : (qw  : QWord);
      10 : (r   : Real);
      11 : (s   : Single);
      12 : (d   : Double);
      13 : (e   : Extended);
      14 : (co  : Comp);
      15 : (cu  : Currency);
      16 : (a   : Array[0 .. 9] of Byte);
  end;
Bei einem record case belegen die einzelnen Felder i, shi, ... a alle einem gemeinsamen Speicherplatz. Da kann ich eine Zahl z.B. in i hineinschreiben und das Bitmuster aus a herauslesen und anzeigen.

Heiner
Dateianhänge
zahlen.zip
für Windows
(613.22 KiB) 69-mal heruntergeladen
zahlen.gz
für Linux
(1.38 MiB) 63-mal heruntergeladen
Zuletzt geändert von Heinrich Wolf am So 20. Mai 2012, 19:00, insgesamt 4-mal geändert.

matthias95
Beiträge: 2
Registriert: So 20. Mai 2012, 06:12

Re: Unterschiedliche Größe Datentypen

Beitrag von matthias95 »

Danke euch beiden habt mir sehr geholfen^^ und und vorallem du Heinrich mit deinem Programm :D . Und auch zu fließkommazahlen udn so hab ich schon lles geschrieben das ist erledigt trotzdme danke^^. Werd mir das jetzt nochmal alles zu gemüt führen :)
und das mit dem Binary war so : ich hatte erstmal kaum typen im internet gefunden und habe dann in wikipedia geschaut was es so an typen geht in den verschiednen Sprachen. hab dann nach und nach im free Pascal wiki geschaut ob es diese in lazarus/free pascal gibt. manchmal gabs die anscheinen aber da stand dann nicht viel im wiki daher hab ich z.B. mal bei delphi etc. geschaut und da stand dann was von der größe und dem werteberreich. Vielleicht sollte ich das nächste mal mich auf ne andere weis informieren^^. Aber ihr habt mit sehr geholfen danke^^
lg Matthias

Heinrich Wolf
Beiträge: 323
Registriert: Di 12. Apr 2011, 13:21
OS, Lazarus, FPC: WinXP + VMWare Player mit Fedora14, L 1.1, FPC 2.7.1
CPU-Target: 1core 1,8GHz 32Bit
Wohnort: Fürth
Kontaktdaten:

Re: Unterschiedliche Größe Datentypen

Beitrag von Heinrich Wolf »

Die Programme, die ich ursprünglich hochgeladen hatte, schrieben das Bitmuster auf ein Label. Das war nur lesbar, nicht beschreibbar. Ich hab die Programme inzwischen nochmal getauscht. Jetzt schreiben die Programme auch das Bitmuster in ein Edit Feld. Bei Änderungen der Zahl wird das Bitmuster neu geschrieben. Bei Änderungen am Bitmuster wird die Zahl neu geschrieben.

Antworten