Warum falscher Output?
-
.hpp
#include <iostream> class Number { public: int takeNum() { int num; std::cout << "Enter a number: "; std::cin >> num; return num; } };.cpp
#include "main.hpp" #include <iostream> int main() { Number num; int number = num.takeNum(); int count = 0; while (number != 0) { number /= 10; count++; } std::cout << "The number of digits in the number is: " << count << std::endl; return 0; }Wenn ich als Zahl eine sehr große angebe, z.B.
834743857345834754, sagt er immer, dass die Länge 10 sei, wieso?
-
Laß dir einfach mal
numnach der Eingabe ausgeben...Erklärung: Eine Variable (hier vom Typ
int) kann nur einen bestimmten Größenbereich abdecken, so daß es bei großen Zahlen intern zu einem Overflow kommt und die gespeicherte Zahl dann entsprechend kleiner ist (mathematisch wird der Modulo-Operator angewendet).Für größere Zahlen benutze
longoder sogarlong long(falls es dein Compiler unterstützt).
Ab C++11 geht auchint64_tbzw.intmax_t(aus<cstdint>), s.a. Fixed width integer types (since C++11).
Welchen Compiler verwendest du denn?
-
@Th69 ich nutze g++
ich hab auch schon probiert bei z.B.
number = num.takeNum();davor einlongzu setzen, ebenso wie beilong num;stattint num;, jedoch ist der gleiche Bug
-
@PasiKas Der Wertebereich von
longundintkann auch gleich groß sein.
Der Standard schreibt nur Mindestbereiche vor.Unter Windows sind beide 32 Bit breit.
Unter Linux64 ist es anders.Evtl hilft
unsigned long long
-
Du mußt alle
intdurchlong long intersetzen, s.a. gcc: Double-Word Integers.
Einlongist beim gcc/g++ auch nur 4 Byte groß (d.h. wie einint).Am besten du erzeugst einen Typ-Alias:
typedef long long int Long;und verwendest dann überall
Long.
-
Oder du benutzt
std::uint64_taus dem Headercstdint.
-
@Th69 sagte in Warum falscher Output?:
Du mußt alle
intdurchlong long intersetzen, s.a. gcc: Double-Word Integers.
Einlongist beim gcc/g++ auch nur 4 Byte groß (d.h. wie einint).Das hängt von der Plattform ab. UNIX/Linux (die Single UNIX Specification schreibt das vor) ist eine ILP32 Plattform (32Bit Modus) bzw. eine LP64 Plattform (64Bit Modus), und das vollkommen unabhängig vom verwendeten Compiler. Windows64 ist mit MSVC oder MinGW LLP64. D.h. nur long long ist 64Bit groß.
Am besten du erzeugst einen Typ-Alias:
typedef long long int Long;und verwendest dann überall
Long.Sinnvoller ist es
uint64_tbzw.int64_tzu nutzen, wenn man explizit diese Länge benötigt.
-
-
@PasiKas Das ist ein Variablentyp, der mit typedef definiert wurde
Den kann man da einsetzen, wo Variablen definiert/deklariert werden.Die Typen mit dem _t am Ende sind in der <cstdint> definiert.
Also wird ein
#include <cstdint>benötigt.
-
@PasiKas sagte in Warum falscher Output?:
wie genau setze ich dann
uint64_tein?In Deinem Beispiel? Und Du meinst wo? Überall dort, wo Du eine Variable namens
interstellst.