Frage zum Wertebereich von long Variablen
-
Hallo zusammen,
warum macht das hier keine Probleme. Ich stopfe doch mehr in eine long Variable rein als eigentlich rein passt:#include <iostream> #include <climits> using namespace std; int main() { long lmax=LONG_MAX, lmin=LONG_MIN; cout << "LONG_MAX: " << lmax << " " << "LONG_MAX + 1: " << lmax+1 << endl; //? cout << "LONG_MIN: " << lmin << " " << "LONG_MIN - 1: " << lmin-1 << endl; //? return 0; }Vielen Dank
lg, freakC++
-
*mist*
-
Das Stichwort, dass dir dies alles erklärt, lautet: Überlauf
-
Das mit dem Überlauf habe ich mir auch angeschaut. Bedeutet dies, dass eine gewisses Erhöhen der maximalen Grenze nicht so schlimm ist, da extra Bits zur Verfügung gestellt werden, aber dies nicht zu weit getrieben werden darf?
Vielen Dank
lg, freakC++PS.: @Drakon: Der Linkinhalt hat mir das jetzt nicht so näher gebracht. Habe ich da was falsch verstanden oder ist das der grund, warum du ihn wieder rausgenommen hast?
-
Ja, hat nicht viel Sinn gemacht. Habe die Frage falsch gelesen.

Wenn du den Überlauf begreifen willst, dann schau dir mal an, was auf binärer Ebene passiert, dann sollte dir klar werden, was und warum es passiert.
EDIT:
Und Nein es wird nichts zusätzlich zur Verfügung gestellt.
-
Ok, mache ich!
Vielen Dank
lg, freakC++
-
Ich war mal so frei.

#include <bitset> #include <iostream> #include <climits> using namespace std; // siehe: http://www.c-plusplus.net/forum/viewtopic-var-t-is-39490.html template <unsigned int NrOfBits> string DezToBin(int Wert) { bitset<NrOfBits> AlsBits(Wert); return AlsBits.template to_string< string::value_type, string::traits_type, string::allocator_type >(); } int main() { long lmax=LONG_MAX, lmin=LONG_MIN; cout << "LONG_MAX: " << lmax << " " << DezToBin<sizeof(long)*8> ( lmax ) << "\n"; cout << "LONG_MAX + 1: " << lmax+1<< " " << DezToBin<sizeof(long)*8> ( lmax + 1 ) << "\n"; //? cout << "LONG_MIN: " << lmin<< " " << DezToBin<sizeof(long)*8> ( lmin ) << "\n"; cout << "LONG_MIN - 1: " << lmin-1<< " " << DezToBin<sizeof(long)*8> ( lmin -1 ) << "\n"; //? return 0; }
-
Jetzt die Quizfrage: was passiert wenn sizeof(long) != sizeof(int)?

-
Nur weils gerade paßt:
Ich verwende sehr gerne den Trick, statt die erwartete Ausgabe in einen String zu schreiben, das Ausgeben zu vertagen, bis klar ist, wohin ausgegeben werden soll.#include <bitset> #include <iostream> #include <climits> using namespace std; template <unsigned int NrOfBits> struct DezToBin { unsigned long Wert; DezToBin(unsigned long _Wert) :Wert(_Wert) { } friend ostream& operator<<(ostream& out,DezToBin<NrOfBits> const& dtb) { unsigned long digit = 1 << (NrOfBits - 1); do { if (dtb.Wert & digit) out<<'1'; else out<<'0'; digit >>= 1; } while (digit != 0); return out; } }; int main() { long lmax=LONG_MAX, lmin=LONG_MIN; cout << "LONG_MAX: " << lmax << " " << DezToBin<sizeof(long)*8> ( lmax ) << "\n"; cout << "LONG_MAX + 1: " << lmax+1<< " " << DezToBin<sizeof(long)*8> ( lmax + 1 ) << "\n"; //? cout << "LONG_MIN: " << lmin<< " " << DezToBin<sizeof(long)*8> ( lmin ) << "\n"; cout << "LONG_MIN - 1: " << lmin-1<< " " << DezToBin<sizeof(long)*8> ( lmin -1 ) << "\n"; //? return 0; }
-
Nur weils gerade paßt:
*Nur weil´s gerade passt:
||
*Nur weil es gerade passt:
-
MrSyntax schrieb:
Nur weils gerade paßt:
*Nur weil´s gerade passt:
||
*Nur weil es gerade passt:
jaja du error 99
