Mehrere Fragen zur Größe von Datentypen
-
Hi,
unter C++ ist ja die Größe von integrierten Datentypen wie int, char usw. nicht exakt definiert, sondern nur garantierte Mindestgrößen.
Wenn man jetzt aber beispielsweise Linux anschaut, haben die Parameter der Systemfunktionen wie socket(), write() immer eben genau diese Datentypen als Parameter. Woher weiß der Compiler, welche Größe der Datentyp für den Linux-Systemaufruf haben muss? Was passiert also, wenn Linux mit einem Compiler kompiliert wurde, der 16-bit-ints hat und mein Compiler 8-bit-ints? Dann knallt es doch, oder?
Noch eine Frage: Wie erstellt man mit 7-Bit-Prozessoren Oktetten, wie sie beispielsweise für TCP-Segmente benötigt werden? Muss man dann das erste gemeinsame Vielfache von 7 und 8 nehmen und dann davon nur die ersten 8 Bit irgendwie befüllen?
Generell leuchtet mir diese ganze Bit-Anzahl-Sache mit den verschiedenen Compilern und Betriebssystemen nicht ganz ein. Ich erbitte Erleuchtung!

-
Datentyper schrieb:
Hi,
Was passiert also, wenn Linux mit einem Compiler kompiliert wurde, der 16-bit-ints hat und mein Compiler 8-bit-ints? Dann knallt es doch, oder?Ja, der Linux-Kernel und dein Programm müssen mit einem kompatiblen, Compiler (also i.d.R. der selbe) übersetzt werden.
-
Der compiler weiß von welcher Größe auszugeben ist. Er wird Dir die entsprechenden Typen zur Verfügung stellen. Wenn nicht: mv cc /dev/null
7bit Prozessoren habe ich noch nie gesehen. 4bit Prozessoren sind eh zu langsam für das Netz, alle anderen können auch 8 bit.
Btw man nimmt in ähnlichen Fällen nicht das vielfache sondern einfach den kleinsten, der groß genug ist, alle erforderlichen bits zu speichern.
Mfg Martin
-
mgaeckler schrieb:
7bit Prozessoren habe ich noch nie gesehen. 4bit Prozessoren sind eh zu langsam für das Netz, alle anderen können auch 8 bit.
Die Sprache C/C++ garantiert mindestens 8 Bit.
-
bittriger schrieb:
mgaeckler schrieb:
7bit Prozessoren habe ich noch nie gesehen. 4bit Prozessoren sind eh zu langsam für das Netz, alle anderen können auch 8 bit.
Die Sprache C/C++ garantiert mindestens 8 Bit.
Die Sprache kennt keine Prozessoren. Wer sagt dass eine Maschine mit 7-Bit Prozessoren nicht 8-bit
chars haben darf?
-
mgaeckler schrieb:
Der compiler weiß von welcher Größe auszugeben ist. Er wird Dir die entsprechenden Typen zur Verfügung stellen.
Wenn wir davon ausgehen, dass mein Linux 32 bit für einen int nimmt und mein Compiler 16-bit-ints, aber 32-bit-longs hat, müsste er ja dann long nehmen. Dann passt aber z. B. diese Referenz hier nicht mehr: http://man7.org/linux/man-pages/man7/socket.7.html. Worauf bezieht die sich denn? Ist das nicht die allgemeine Manual?
mgaeckler schrieb:
Btw man nimmt in ähnlichen Fällen nicht das vielfache sondern einfach den kleinsten, der groß genug ist, alle erforderlichen bits zu speichern
Wenn man dann z. B. einen 10-bit-Typen nimmt, aber nur 8 bit braucht, wie teilt man dann beispielsweise der Netzwerkkarte mit: "Liebe Netzwerkkarte, nimm doch bitte bloß 8 der 10 Bits!"?
-
Verstehenwoller schrieb:
mgaeckler schrieb:
Der compiler weiß von welcher Größe auszugeben ist. Er wird Dir die entsprechenden Typen zur Verfügung stellen.
Wenn wir davon ausgehen, dass mein Linux 32 bit für einen int nimmt und mein Compiler 16-bit-ints, aber 32-bit-longs hat, müsste er ja dann long nehmen. Dann passt aber z. B. diese Referenz hier nicht mehr: http://man7.org/linux/man-pages/man7/socket.7.html. Worauf bezieht die sich denn? Ist das nicht die allgemeine Manual?
mgaeckler schrieb:
Btw man nimmt in ähnlichen Fällen nicht das vielfache sondern einfach den kleinsten, der groß genug ist, alle erforderlichen bits zu speichern
Wenn man dann z. B. einen 10-bit-Typen nimmt, aber nur 8 bit braucht, wie teilt man dann beispielsweise der Netzwerkkarte mit: "Liebe Netzwerkkarte, nimm doch bitte bloß 8 der 10 Bits!"?
Wenn das OS 32 bit für ein int will, dann bekommt es das auch vom Compiler, wenn nicht /dev/null
Um die anderen Feinheiten kümmert sich auch das System. Normalerweise ist das die Aufgabe des Treibers.
Habe schon oft i/O implementiert, wo 7 bit gefordert waren. Die haben dann halt 8 bekommen und eines ignoriert.
Mfg Martin
-
Arcoth schrieb:
Die Sprache kennt keine Prozessoren. Wer sagt dass eine Maschine mit 7-Bit Prozessoren nicht 8-bit
chars haben darf?Die Sprache sagt, dass man mit chars lückenlos über den gesamten Seicher laufen darf. Wie soll das gehen wenn auf den Speicher in 7 bit Granularität zugegriffen wird und ein char 8 bit groß ist? Was ginge, wären 14 bit chars.
-
Wenn Du allerding die Hardware selbst programmieren musst, musst Du Dir die Daten mit den bit Operatoren zusammenstellen.
Das braucht man auch z.b. bei der UTF-8 Kodierung.
-
TNA schrieb:
Die Sprache sagt, dass man mit chars lückenlos über den gesamten Seicher laufen darf.
Mir scheint, du vermischst hier physikalische und logische Begriffe. Ob ich mir meine 8 bit-Einheiten aus jeweils zwei physikalischen 7 bit-Werten zusammensetze oder analog speichere oder sonstwas, das darf die Sprache nichts angehen.
-
TNA schrieb:
Arcoth schrieb:
Die Sprache kennt keine Prozessoren. Wer sagt dass eine Maschine mit 7-Bit Prozessoren nicht 8-bit
chars haben darf?Die Sprache sagt, dass man mit chars lückenlos über den gesamten Seicher laufen darf. Wie soll das gehen wenn auf den Speicher in 7 bit Granularität zugegriffen wird und ein char 8 bit groß ist? Was ginge, wären 14 bit chars.
Es wären auch 8 bittige chars möglich.
Einerseits könnte die C++ Implementierung einfach 8 stück 7-bittige machine words zu 7 stück 8-bittigen chars zusammenfassen. Dabei müsste vermutlich massiv viel gelockt werden, aber der Standard verlangt ja nicht dass irgendwas besonders schnell oder besonders intelligent implementiert wäre. Es muss nur das vorgeschriebene Verhalten zeigen.
Andrerseits könnte die C++ Implementierung auch einfach 6 der 14 Bit wegwerfen. So lange es kein mögliches Konstrukt in einem (well-formed) C++ Programm gibt mit dem diese "6 Bit Löcher" in irgend einer Art und Weise beobachtet werden können, müsste es mMn. OK sein.
Aus Sicht des C++ Programms gibt es dann keine Löcher, die verworfenen 6 Bit existieren für das C++ Programm einfach nicht.
Das ist mit "lückenlos" gemeint.