Größe von Datentypen in der Informatik?

4 Antworten

Die Zahl der Bytes, die notwendig sind, jeweils einen Wert eines bestimmten Datentyps im Stack zu speichern, lässt sich (in C/C++) abfragen mit Hilfe der Methode sizeof().

Lies dazu https://docs.microsoft.com/de-de/cpp/c-language/sizeof-operator-c?view=msvc-170 .

Wo im Anwendungsfall dann zusätzlich Heap-Speicher notwendig sein wird, d.h. dynamisch zu allokierender Speicher, kann nur die Anwendung selbst uns sagen.

Die genauen Terme von denen man spricht, hängen vom System und der Programmiersprache ab. Ein Integer kann auch als 8 Bit = 1 Byte definiert sein (int8 / uint8). Siehe https://de.wikipedia.org/wiki/Integer_(Datentyp)

Was negative Zahlen angeht: Hier ist es tatsächlich so, dass ein Bit für das Vorzeichen verloren geht. Nicht ein ganzes Byte - das wäre ja unnötig. Entweder ist das Vorzeichen (Minus) vorhanden, oder nicht. Ja oder nein. Dafür reicht ein Bit (bei sowas wird dann auch von "Flag" gesprochen).

Ist ein Unsigned Int als 8 Bit definiert (uint8), könnte also Werte von 0 bis 255 anzeigen, hätte ein Signed Int zur eigentlichen Speicherung der Zahl 7 Bit zur Verfügung plus eben das Vorzeichen, also Werte von -128 bis 127.

Woher ich das weiß:Berufserfahrung – Inhaber einer App-Agentur & 15+ Jahre Programmiererfahrung

Jancek 
Beitragsersteller
 27.12.2021, 17:48

Danke, danke. Aber braucht ein "-" nicht 7 Bit? Laut der Tabelle https://tools.piex.at/ascii-tabelle/ sind anscheinend 7 Bit nötig

0
Functional  27.12.2021, 18:06
@Jancek

Das Minus wird nicht als ASCII-Zeichen gespeichert, das wäre unnötiger Speicherverbrauch. Die einzelnen Ziffern in der Zahl werden ja auch nicht jeweils als ASCII-Zeichen gespeichert.

Wie gesagt: Entweder das Minus ist vorhanden, oder nicht. Es gibt nur zwei Möglichkeiten. 0 = Kein Minus vorhanden, 1 = Minus vorhanden. 0 oder 1, das lässt sich also mit einem Bit darstellen.

0
Jancek 
Beitragsersteller
 27.12.2021, 20:50
@Functional

ahhh, ich verstehe. Vielen Dank. Aber 1 Bit geht "drauf"? Muss ja ein Vorzeichenbit sein, oder?

0
Functional  28.12.2021, 09:54
@Jancek

Wie drauf? Ein signed Int als auch ein unsigned Int haben wie gleiche Anzahl an Bits (in der Regel 8). Beim signed Int ist daher halt nur ein Bit weniger für die Speicherung der eigentlichen Zahl vorhanden, weil ein Bit halt für das Vorzeichen benötigt wird.

0

Char ist typischerweise 8 Bit richtig.

Int und long int sind Plattformabhängig. Int ist dabei meistens ein Word der Architektur und long int ein double Word.

Warum sollte ein negativer Integer größer sein? Der String "-120" ist ja ein komplett anderes Objekt als die Zahl an sich. Der PC speichert ja nicht die Zahlen als string im Speicher, sondern eben durch ihre Binärrepräsentation. Ein signed int hat gleich viele Bit wie ein unsigned int aber der Wertebereich ist natürlich ein anderer.

Die Zahl 2 in einem unsigned char ist zB 0000 0010 die Zahl -2 in der typischen 2er Komplememtdarstellung eben 1111 1110 also ein signed char braucht somit auch nur 8 Bit.

Btw falls du in einem C oder C++ Programm garantiert einen 32Bit Interger haben möchtest solltest du int32_t verwenden anstatt nur int, weil int eben je nach Plattform unterschiedlich groß sein kann.


Jancek 
Beitragsersteller
 27.12.2021, 18:02

Also kann man bei einem signed integer im minus bereich gleich viele Zahlen darstellen, wie im positiven Bereich? Sprich das "-" Vorzeichen nimmt keinen Speicher weg. Ich glaube das dürften 7 Bit sein, laut ASCII Tabelle.

0
PeterKremsner  27.12.2021, 18:06
@Jancek

Laut Ascii Tabelle sinds 7 bit, so wie jedes Ascii Zeichen 7 Bit benötigt und jedes UTF8 Zeichen 8 Bit.

Aber die Zahl -2 sind nicht zwei Ascii Zeichen sondern eine negative Zahl welche in einem Byte dargestellt werden kann. Der String "-2" sind zwei Ascii zeichen braucht als 2 Byte Speicher.

Du musst also zwischen einer Zahl und dem String unterscheiden. Ein String besteht aus Ascii Zeichen eine Zahl nicht.

Im wesentlichen geht dir bei einem Signed int 1 Bit verloren. Der unsigned char geht zB von 0 bis 255 der signed char von -128 bis 127. Signed und unsigned char sind dabei jeweils ein Byte groß.

0
Jancek 
Beitragsersteller
 27.12.2021, 18:18
@PeterKremsner

Die ascii-128 Tabelle braucht ja 7 Bit pro Zeichen. Verstehe alles bis auf den letzten Absatz: Warum gehen mir bei einem Signed int 1 Bit verloren?

0
Jancek 
Beitragsersteller
 27.12.2021, 18:20
@PeterKremsner

Ah, 1 Bit geht bei signed verloren, da es als Vorzeichen genutzt wird, oder?

0
PeterKremsner  27.12.2021, 18:42
@Jancek

Die Ascii Tabelle braucht an sich nichts. Die Ascii Tabelle ist nur eine Zuordnung zwischen einer 7 Bit Zahl und einem Zeichen.

Der PC kennt intern ja nur Zahlen und keine Buchstaben, daher braucht er für die Anzeige einfach eine Tabelle wo drinnen steht welche Zahl bei der Ausgabe eines Strings welches Zeichen bedeutet.

0
PeterKremsner  27.12.2021, 18:47
@Jancek

Ja mehr oder weniger.

Es ist zwar nicht nur das Vorzeichen aber wenn das MSB gesetzt ist ist die Zahl negativ.

Es ist in diesem Sinne aber nicht nur ein Vorzeichen weil wenns ein reines Vorzeichen wäre wäre ja

1000 0000 und 0000 0000 die selbe Zahl nämlich 0 was nicht der Fall ist.

1000 0000 ist bei einem 8 Bit signed int eben die Zahl -128. Das ganze nennt sich Zweierkomplementdarstellung die zusätzlich zu dem auch die Eigenschaft hat, dass man keine besondere Subtraktion implementieren muss sondern nur die Addition.

Die Rechung 1 und -1 ergibt sich damit eben zu 0000 0001 + 1111 1111 was eben 0000 0000 also die Korrekte Antwort 0 liefert.

0
Jancek 
Beitragsersteller
 27.12.2021, 20:38
@PeterKremsner

Danke, ich verstehe das Zweierkomplement, aber 2 Fragen hätte ich noch. (danke für deine Hilfe) Wie weiß ich bei einer Zahl, ob sie im Zweierkomplement dargestellt ist oder normal? Weil 4 Bits, bsp. 1111 = 15, jedoch könnte man auch denken, es sei eine -1 im Zweierkomplement. Woher weiß ich jetzt, wann ich die 4 Bits wie betrachte?

0
Jancek 
Beitragsersteller
 27.12.2021, 20:43
@PeterKremsner

und das "-" im Integer nimmt also keinen Zusätzlichen Platz ein? Sprich Bits? Und ich kann dank dem +1 beim Zweierkomplement eine Zahl im Minus Bereich mehr darstellen?

0
Jancek 
Beitragsersteller
 27.12.2021, 20:51
@PeterKremsner

ahh, ich habe also richtig verstanden: 1 Bit wird quasi als Vorzeichen bit genutzt? Somit kann ein signed 4 Byte Intenger bei einer Minus Zahl, Zahlen bis 2^31 darstellen?

0
PeterKremsner  27.12.2021, 23:47
@Jancek

Man weiß es nicht ob die Zahl eine Zweierkomplementdarstellung ist oder einfach nur unsigned.

Es kommt in diesem Fall auf den Datentyp an wie diese Zahl intepretiert wird.

0
PeterKremsner  27.12.2021, 23:50
@Jancek

Ja und nein das - nimmt schon Platz ein aber die 0 wird nicht doppelt belegt.

Du kannst im Positiven Bereich eben nur 2^7 Zahlen Darstellen also Zahlen von 0 bis 127 und im Negativen ebenfalls nur 2^7 Zahlen. Dadurch dass es die Zahl 0 aber nur einmal gibt geht der negative Bereich von -1 bis -128

0
Jancek 
Beitragsersteller
 28.12.2021, 00:46
@PeterKremsner

Ich verstehe, also Maxium wäre (in C):

unsigned char a = (0 ~ 255) = 256 mögliche Darstellungen = 2^8 = 8 Bit = 1 Byte

signed char b = (-128 ~ 0 ~ 127) = 256 mögliche Darstellungen = 2^8 = 8 Bit = 1 Byte

Aber wo wird hier dann das Minus gespeichert?

In verschiedenen Videos habe ich beim Zweierkomplement gesehen, dass vorne noch ein Vorzeichenbit ist. Müssten es dann nicht 9 Bit sein? Also immer 9 Bit bei signed?

0
Jancek 
Beitragsersteller
 28.12.2021, 01:43
@PeterKremsner

ahh, ich habs schon. Also bezüglich meiner anderen Antwort und der Frage dort. 0 ~ 127 sind ja 128 = 2^7, also 7 Bit, somit bleibt 1 Bit fürs Vorzeichen. Gleich ist es bei -128 ~ 0 (exklusive 0) = 2^7 also 128, somit bleibt 1 Bit fürs Vorzeichen.

Ich glaube, dass es so richtig ist, oder?

0
PeterKremsner  28.12.2021, 12:03
@Jancek

Ja genau. Wenn das erste Bit gesetzt ist ist die Zahl im Zweierkomplement negativ richtig, also da steckt das Vorzeichen drinnen, es ist aber nicht nur das Vorzeichen sondern hat zudem auch noch gewissermaßen eine Wertigkeit.

Es gibt allerdings auch Darstellungsformen wo das erste Bit nur das Vorzeichen darstellt und die restlichen Bits die Zahl. Dort ist dann eben die 0 zwei mal vorhanden. Dort wäre eben 0 das Bitmuster 0000 0000 und 1000 0000 würde der Zahl -0 entsprechen. Bei dieser Darstellung geht dir also eben eine negative Zahl verloren. Womit man hier eben von -127 bis 127 kommt.

Btw eine 9 Bit Zahl würde keinen Sinn machen. Die kleinste Speichereinheit in einem PC ist ein Byte. Für 9Bit würde man also 2 Byte brauchen, da kann man gleich einen Signed 16 Bit Datentyp wählen. Wenn du das in C betrachtest dann bestimmt der Datentyp immer wie viele Bit verwendet werden, also char sind eben 8, int ein Word usw. Die signed Datentypen verwenden genau gleich viele Bits werden aber anders interpretiert.

1
Jancek 
Beitragsersteller
 28.12.2021, 13:28
@PeterKremsner

Vielen Dank für die Antworten! Diese Darstellung, wo eine -0 vorkommt und eine Zahl somit verloren geht, nennt sich doch Einerkomplement, oder?

Aber in einem Sonderfall wird das Vorzeichenbit ja mitgerechnet?

-128 ist doch der kleinste Wert bei einem signed char.

Dabei müsste man also das Vorzeichenbit () als Wert "nutzen".

(1)000 0000

-128

(0)111 1111

127

Ist das ein Sonderfall bei -128?

Geht dann nicht auch -255?

(1)111 1111

0
Jancek 
Beitragsersteller
 28.12.2021, 14:07
@PeterKremsner

ich glaube, ich habs verstanden. Hab schriftlich Zweierkomplement geübt. 128 ist ja 1000 0000. Beim Zweierkomplement kommt jedoch auch 1000 0000 raus.

128 im positiven Bereich geht nicht, da ja dann das letzte Bit eine 1 hat, was ja ein negatives Vorzeichen ist. Somit hat man dann -128.

Also wird das Vorzeichen quasi auch genutzt.

1000 0000 im Zweierkomplement ist also -128

Laut dem Zweierkomplement ist -1 dann 1111 1111.

Sehr verwirrend für Neulinge.

Kann bei unsigned 1 Byte überhaupt bei minus Zahlen (im Zweierkomplement dargestellt) die letzte Stelle eine 0 sein?

Sprich 0111 1111

Nicht möglich, oder?

Sonst würde das alles keinen Sinn machen.

0111 1111 ist ja 127 und das Maximum im positiven Bereich

0
PeterKremsner  28.12.2021, 15:32
@Jancek

Unter Einerkomplement kenne ich die einfache Invertierung der Stellen. Also Einerkomplement deswegen weil sich Eine Zahl und ihr Einkomplement bei allen Bits auf 1 addiert also:

0000 0001 und das Einerkomplement davon ist jetzt 1111 1110 Die Summe dieser Zahlen ist 1111 1111.

Zweierkomplement weil sich bei der Summe jedes Bit auf 2 addiert wobei 2 = 0 (mod 2) gilt, also im Binärsystem ist 2 = 0 daher:

0000 0001 und das Zweierkomplement 1111 1111 in Summe ergibt 2222 2222 also 0000 0000 was ja genau das schöne an dieser Darstellung ist.

Es gibt auch die Einerkomplementdarstellung hier gibts 0 und -0 allerdings haben die die Bitmuster 0000 0000 und 1111 1111 die reine Vorzeichendarstellung hätte hingegen für 0 und -0 0000 0000 und 1000 0000.

Kann bei unsigned 1 Byte überhaupt bei minus Zahlen (im Zweierkomplement dargestellt) die letzte Stelle eine 0 sein?

Das LSB kann natürlich null sein, aber eine negative Zahl im Zweierkomplement muss das MSB auf 1 haben. Also 0111 1111 wäre eben in der Zweierkomplementdarstellung die Zahl 127. Sobald das MSB gesetzt ist 1xxx xxxx ist die Zahl negativ.

0
Jancek 
Beitragsersteller
 28.12.2021, 15:52
@PeterKremsner

Vielen Dank! Ich habe es soweit verstanden! Sehr hilreich!

0
Bushmills145  11.05.2022, 01:42
@Jancek

Jein. Die 0 ist da ein Sonderfall - wenn Du die zu den positiven Zahlen zählst, dann stimmt es. Wenn Du aber positive und negative Zahlen als symmetrisch um die 0 herum ansiehst, dann lässt sich eine negative Zahl mehr darstellen als positive Zahlen, zumindest in der twos-complement Darstellung (welches die übliche Darstellung von negativen Zahlen ist). Richtig ist aber dass das "-" keinen zusätzlichen Speicher wegnimmt, im Vergleich negative zu positive Zahlen.

0

Die Datenlänge hängt von der Programmiersprache und der verwendeten Hardware ab. Generell stimmt was Du zu negativen Zahlen sagst. Wenn positive und negative Zahlen abgebildet werden sollen, geht ein Bit für das Vorzeichen verloren. Und die maximale positive und negative Zahl ist halb so groß.

Woher ich das weiß:Studium / Ausbildung