Standard Frage
-
Warum definiert der Standard eigentlich nicht die Größe der nativen Datentypen? z.B:
char => 1 byte (ok, das ist schon definiert.)
short => 2 byte
long => 4 byte
long long => 8 byte
long long long => 16 byte (Oder so. ^^)
float => 4 byte
double => 8 byte
long double => 10 byte (Oder 12? Hm..)int => Eine der Voherigen, sollte Registerbreite entsprechen bzw. damit sollte das Zielsystem schnell rechnen können.
Das würde doch vieles leichter machen?
-
FragenstellerR schrieb:
Das würde doch vieles leichter machen?
1. Wieso?
2. Denk mal an die Zukunft.
3. Denk mal an den Rest der Welt (die ist nicht nur x86).
4. cstdint gibt's neuerdings auch.P.S.: Und ein Byte ist übrigens nicht als 8 Bit festgelegt, um mal dein Weltbild zu erschüttern
.edit: Nur damit wir uns richtig verstehen: Du willst die Größen festlegen, oder? Denn Mindestgrößen in der Art wie du sie nennst, gibt es schon längst.
-
SeppJ schrieb:
1. Wieso?
Weil man sich dann darauf verlassen könnte, dass sizeof(short) _genau_ 2 ist, was sehr hilfreich sein kann, wenn man z.B. Systemnah programmiert.
SeppJ schrieb:
2. Denk mal an die Zukunft.
Meinst du die Leute haben dann so viel Geld, dass ein long long nicht mehr reicht?^^
SeppJ schrieb:
3. Denk mal an den Rest der Welt (die ist nicht nur x86).
Ja.. und?
SeppJ schrieb:
4. cstdint gibt's neuerdings auch.
Ja, aber der ist nervig. Zumal ich ja immer noch keinen Nachteil darin sehen kann, den Typen definierte Größen zu geben.
SeppJ schrieb:
P.S.: Und ein Byte ist übrigens nicht als 8 Bit festgelegt, um mal dein Weltbild zu erschüttern
.
Wie? Dann könnte das Ergebnis vonunsigned char c = 2 << 1;also 0 sein? (Überlauf)
SeppJ schrieb:
edit: Nur damit wir uns richtig verstehen: Du willst die Größen festlegen, oder? Denn Mindestgrößen in der Art wie du sie nennst, gibt es schon längst.
Ja, ich möchte sie festlegen, wobei Mindestgrößen auch schon nicht schlecht wären. Die gibt es schon? Bisher kannte ich nur
char <= short <= int <= long <= long long
-
Die Anzahl Bytes für die Datentypen sollte schon der Compiler in Abhängigkeit des aktuellen Systems festlegen dürfen. Man will ja auch, dass der Compiler optimieren darf oder soll.
Denk mal über Portabilität nach!

Aber bei FORTRAN hatte es so etwas einmal gegeben mit INT2, INT4, REAL4, REAL8 - war nur nicht sehr portabel.
-
char >= 8 Bit
short >= 16 Bit
long >= 32 Bit
long long >= 64 BitMeinst du die Leute haben dann so viel Geld, dass ein long long nicht mehr reicht?^^
Nein, aber Computer mit 32 Bit Bytes und 256 Bit Wortbreite. Willst du das dann long long long long long long int nennen?
Ja.. und?
Es gibt Computer mit 9 Bit Bytes. Oder 48 Bit Bytes. Auf denen möchte man auch standardkonform programmieren können.
-
SeppJ schrieb:
Willst du das dann long long long long long long int nennen?
very_long_int vielleicht.
Schon gut, ich bin überzeugt, außer dass mir Computer mit 9-bittigen Bytes wohl immer suspekt bleiben werden.

-
...um die liste von oben zu vervollständigen: Ein int hat auch mindestens 16 Bits.
Nächster Schock: Für negative Zahlen werden drei verschiedene Binärdarstellungen erlaubt. Nur eine davon ist das Zweierkomplement.
Bei Floats sieht es ähnlich aus.
Ein 'float' ist mindestens so genau wie 6 Dezimalstellen (insgesamt)
Ein 'double' ist mindestens so genau wie 10 Detimalstellen (insgesamt)
Ein 'long double' ist mindestens so genau wie 10 Dezimalstellen (insgesamt)
Ein double kann alle float-Werte exakt darstellen.
Ein long double kann alle double-Werte exakt darstellen.Darüber hinaus gibt es (wird es geben) stdint.h bzw cstdint. Dort findet man typedefs für "mindestbreite-Typen" wie z.B. int_least32_t. Optional gibt es "exaktbreite-Typen" wie int32_t. Bei den "exaktbreite-Typen" (sofern sie angeboten werden) wird auch das Zweierkomplement als Binärdarstellung von negativen Zahlen garantiert.
-
Ja, aber der ist nervig. Zumal ich ja immer noch keinen Nachteil darin sehen kann, den Typen definierte Größen zu geben.
Wieso nervig? Exakt was du suchst, imho perfekt um zu zeigen, dass die Größe des Integers nicht beliebig ist.
Und hey, du sparst praktisch immer Tipparbeit.
-
Was ich mich schon immer gefragt habe: wenn ich mich nicht darauf verlassen kann, dass ein Char 8 bit groß ist, wie setze ich dann die Übertragung von Binärdaten per Netzwerk um? Abgesehen von der Byte-Order weiß ich ja dann nie, wie viele Bits auf dem Empfangssystem einem Byte entsprechen. Wenn ich also auf dem Sendesystem 8 Bits pro Byte hab und auf dem Zielsystem 1 Bit, kann das doch gar nicht funktionieren. Wie wird das gelöst?
-
So etwas wie
#include <climits> #if CHAR_BIT != 8 #error "Dieses Programm ist nicht für exotische Maschinen ausgelegt" #endifist völlig OK. Ich würde mir darüber erst Sorgen machen, wenn es so weit ist, dass das Programm auf anderer Hardware laufen soll, wo CHAR_BIT==8 nicht gilt.
-
Das sind in der Praxis Schein-Probleme. Es wird nie wieder einen Mainstream-Prozessor geben, auf dem ein Byte nicht 8 Bits hat (Prozessoren für Spezialaufgaben ausgenommen). Warum sollte ein Hersteller sowas tun, es hätte doch nur Nachteile.
Es gibt Computer mit 9 Bit Bytes. Oder 48 Bit Bytes. Auf denen möchte man auch standardkonform programmieren können.
Im Wesentlichen gab es die, und die Hersteller dieser Möhren haben damals im Standardisierungsprozess so lange Terz gemacht, bis sie berücksichtigt wurden.