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 sogar long long (falls es dein Compiler unterstützt).
    Ab C++11 geht auch int64_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 ein long zu setzen, ebenso wie bei long num; statt int num;, jedoch ist der gleiche Bug



  • @PasiKas Der Wertebereich von long und int 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 durch long long int ersetzen, s.a. gcc: Double-Word Integers.
    Ein long ist beim gcc/g++ auch nur 4 Byte groß (d.h. wie ein int).

    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 Header cstdint.



  • @Th69 sagte in Warum falscher Output?:

    Du mußt alle int durch long long int ersetzen, s.a. gcc: Double-Word Integers.
    Ein long ist beim gcc/g++ auch nur 4 Byte groß (d.h. wie ein int).

    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.



  • @john-0 sagte in Warum falscher Output?:

    uint64_t

    wie genau setze ich dann uint64_t ein?



  • @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.

    https://cplusplus.com/reference/cstdint/



  • @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 interstellst.


Log in to reply