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
num
nach 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
long
oder sogarlong long
(falls es dein Compiler unterstützt).
Ab C++11 geht auchint64_t
bzw.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 einlong
zu setzen, ebenso wie beilong num;
stattint num;
, jedoch ist der gleiche Bug
-
@PasiKas Der Wertebereich von
long
undint
kann 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
int
durchlong long int
ersetzen, s.a. gcc: Double-Word Integers.
Einlong
ist 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_t
aus dem Headercstdint
.
-
@Th69 sagte in Warum falscher Output?:
Du mußt alle
int
durchlong long int
ersetzen, s.a. gcc: Double-Word Integers.
Einlong
ist 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_t
bzw.int64_t
zu 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_t
ein?In Deinem Beispiel? Und Du meinst wo? Überall dort, wo Du eine Variable namens
int
erstellst.