Frage zum Suffix von Zahlen
-
Hallo.
Ich habe hier ein Buch (Der C++ Programmierer_Ullrich Breymann)
in dem steht dass man mit einem Suffix "(l, ll, L, LL)" Long oder Long Long Zahlen kennzeichnet oder "u, U" kennzeichen unsigned Zahlen.Aber wozu brauche ich das?
Beim Anlegen einer Variable sage ich doch schon ob ich int oder long haben will,
wozu dann noch ein suffix anhängen?
und beim Anlegen einer unsigned int initiallisiere ich sie doch mit einer vorzeichenloser Zahl, also wozu dann noch ein "u" anhängen.vielen Dank
-
Die braucht man z.B. wenn man mit Literalen rechnet, die einen anderen Datentyp haben sollen als üblich:
float a = 1/3;
Hierbei hat a den Wert Null, da auf der rechten Seite eine Integerdivision steht, da 1 und 3 Integer sind.
float a = 1f/3f;
liefert das was man hier normalerweise beabsichtigt.
-
Zahlenliterale haben den Typen:
8int
8.8double
Willst du das ändern, musst du das explizit sagen, ansonsten ist eine Ganzzahl ein
int
, und eine Fließkommazahl eindouble
.void fkt(unsigned) { } void fkt(unsigned long long) { } int main() { fkt( 8 ); // Mehrdeutig fkt( 8u ); fkt( 8ull ); }
-
ok, aber warum nicht gleich ".0" anhängen?
Ist doch auch viel leichter zu lesen.
-
Viel wichtiger noch: Funktionsüberladungen und Templateparameter. Die typischen Beispiele mit denen man wohl als erstes Bekanntschaft macht:
void foo(double d); void foo(float f); int main() { foo(3); // Welche Version ist gemeint? }
template <typename T> void read_value(T& value, T default_value); int main() { unsigned u; read_value(u, 0); // u ist unsigned, aber 0 ist int. Kann nicht automatisch entscheiden, welcher Typ richtig ist. }
-
robertko schrieb:
ok, aber warum nicht gleich ".0" anhängen?
Bei Divisionen geht das, aber im letzte Beispiel von out funktioniert das nicht mehr.
-
mmhh. ok,
ich verstehe noch nicht allzuviel davon.
wer das Buch zufälling kennt, weiß, auf welcher seite ich gerade bin.
Danke
-
Suffixe braucht man auch, wenn man eine Zahl als Hexadezimalwert schreibt. Ich würde aber auch behaupten, dass man Suffixe je nach Aufgabenbereich eher selten benötigt. Aber wissen wie sie funktionieren sollte man trotzdem.
-
TNA schrieb:
Suffixe braucht man auch, wenn man eine Zahl als Hexadezimalwert schreibt. Ich würde aber auch behaupten, dass man Suffixe je nach Aufgabenbereich eher selten benötigt. Aber wissen wie sie funktionieren sollte man trotzdem.
Du meinst die Präfixe "0x", "0X" und "0" (für oktal). Hexadezimal und Oktalzahlen dürfen selber natürlich auch nochmal unterschiedliche Typen haben. Hexadezimal darf in C99 sogar einen floating point Typen haben! In C++11 funktioniert es beim GCC anscheinend auch, selbst im pedantischen Modus:
https://ideone.com/kc7lUpKonnte aber leider keine entsprechende Stelle im Standard finden.
-
SeppJ schrieb:
Konnte aber leider keine entsprechende Stelle im Standard finden.
Siehe dir die Grammatik auf §2.14.4 an.
-
Sone schrieb:
SeppJ schrieb:
Konnte aber leider keine entsprechende Stelle im Standard finden.
Siehe dir die Grammatik auf §2.14.4 an.
hatte mich schon gefragt, wie lange das jetzt wohl dauert
-
SeppJ schrieb:
Hexadezimal darf in C99 sogar einen floating point Typen haben! In C++11 funktioniert es beim GCC anscheinend auch, selbst im pedantischen Modus:
https://ideone.com/kc7lUpKonnte aber leider keine entsprechende Stelle im Standard finden.
Das habe ich auch noch nie gesehen...
Ist eine Erweiterung: http://gcc.gnu.org/onlinedocs/gcc/Hex-Floats.html
-
Sone schrieb:
SeppJ schrieb:
Konnte aber leider keine entsprechende Stelle im Standard finden.
Siehe dir die Grammatik auf §2.14.4 an.
Eben da habe ich doch geguckt! Da finde ich aber nichts davon. Ist mein Draft (N3337) zu alt?
-
SeppJ schrieb:
Sone schrieb:
SeppJ schrieb:
Konnte aber leider keine entsprechende Stelle im Standard finden.
Siehe dir die Grammatik auf §2.14.4 an.
Eben da habe ich doch geguckt! Da finde ich aber nichts davon.
Was findest du nicht? Die Grammatik ist eindeutig: Entweder, der Beginn eines floating literals ist eine Reihe von Ziffern oder ein Punkt. Nach der Ziffernreihe kommt als nächstes "nicht-Ziffer"-Zeichen entweder ein Punkt oder e/E. Was kann man da nicht finden?
-
Sone schrieb:
SeppJ schrieb:
Sone schrieb:
SeppJ schrieb:
Konnte aber leider keine entsprechende Stelle im Standard finden.
Siehe dir die Grammatik auf §2.14.4 an.
Eben da habe ich doch geguckt! Da finde ich aber nichts davon.
Was findest du nicht? Die Grammatik ist eindeutig: Entweder, der Beginn eines floating literals ist eine Reihe von Ziffern oder ein Punkt. Nach der Ziffernreihe kommt als nächstes "nicht-Ziffer"-Zeichen entweder ein Punkt oder e/E. Was kann man da nicht finden?
Hast du meine Frage überhaupt gelesen?
SeppJ schrieb:
Hexadezimal darf in C99 sogar einen floating point Typen haben! In C++11 funktioniert es beim GCC anscheinend auch, selbst im pedantischen Modus:
https://ideone.com/kc7lUpKonnte aber leider keine entsprechende Stelle im Standard finden.
Was dann wohl offensichtlich nicht vom Standard gedeckt ist, weil eine entsprechende Klausel fehlt, sofern es eben nicht noch irgendwo einen versteckten Absatz gibt, dass C99-Literale auch erlaubt sind. Entsprechend ist das Literal im Link nicht C++-portabel. In C99 ist dies aber ausdrücklich durch den Standard gedeckt!
-
for(auto i = 0u; i != n; ++i)
-
SeppJ schrieb:
Was dann wohl offensichtlich nicht vom Standard gedeckt ist, weil eine entsprechende Klausel fehlt
Wie soll das möglich sein? Das wäre ein Verstoß gegen die Grammatik, die schließlich dezidiert und eindeutig die Syntax beschreibt - nicht die Klauseln. Es ist nicht nötig, auf Features die in anderen Standards erklärt sind zu verweisen, da hätte man sich viel sparen können.
Aber gut, wenn du meinst - du bist der Boss...
-
bei Integer Literalen beachte auch
C.2 C++ and ISO C++ 2003
2.14.2
Change: Type of integer literals
Rationale: C99 compatibility.
Effect on original feature: Certain integer literals larger than can be represented by long could change from an unsigned integer type to signed long long.bei einem Compiler mit 32-Bit long int ist das Literal 2147483648l nach C++2003 ein unsigned long int und nach C++11 ein long long int.
-
Also ich verstehe das so:
Certain integer literals larger than can be represented by long could change from an unsigned integer type to signed long long.
-
das "could change" bezieht sich darauf, daß es davon abhängt, wie groß ein long int ist
bei einem Compiler mit 64-Bit long int ist das Literal 2147483648l nach C++2003 und nach C++11 ein long int (keine Änderung).
-
Sone schrieb:
SeppJ schrieb:
Was dann wohl offensichtlich nicht vom Standard gedeckt ist, weil eine entsprechende Klausel fehlt
Wie soll das möglich sein? Das wäre ein Verstoß gegen die Grammatik, die schließlich dezidiert und eindeutig die Syntax beschreibt - nicht die Klauseln. Es ist nicht nötig, auf Features die in anderen Standards erklärt sind zu verweisen, da hätte man sich viel sparen können.
Bei der Standardbibliothek wird auf den C-Standard verwiesen, selbst wenn dadurch indirekt Sachen wie die Mindestgrößen der Datentypen festgelegt wird, die eigentlich Kernbestandteil der Sprache sind. Die stehen nämlich ansonsten an keiner Stelle direkt im C++-Standard, obwohl es sie gibt.