datentyp unsigned long long

  • hallo,

    der Datentyp

    Code
    unsigned long long

    soll doch eigentlich von o bis 0 … 18446744073709551615 zählen.
    Habe es für meinen Code verwendet.

    Passiert jedoch Folgendes:

    Code
    counter       mikrosekunden
    1078           2136952041
    1079            2138952093
    1080            2140952154
    1081            2142952195
    1082            2144952257
    1083            2146952314
    1084            18446744071563536683
    1085            18446744071565536730
    1086            18446744071567536790

    realisiert mit:

    Code
    unsigned long long usecs = ((unsigned long  long)d.tv_nsec / 1000) + (d.tv_sec * 1000000);
     f=fopen("document.txt","a+");
     fprintf(f, "%d   %llu\n", Index, usecs);

    Wie kann man da so einen riesen Sprung erklären

    Beim Datentyp

    Code
    unsigned long usecs = ((unsigned long)d.tv_nsec / 1000) + (d.tv_sec * 1000000);
             f=fopen("document.txt","a+");
             fprintf(f, "%d\t\t%ld\n", Index, usecs);


    passiert folgendes:

    Code
    1     17617753259
    2               17617727593
    3               17916658618
    4               17916721990

    Es geht also bei so einer hohen Zahl los.

    Welchen Datentyp nehme ich denn da, damit ich eine saubere Zählung bekomme?

  • Ich denke, der Datentype ist schon richtig.
    Allerdings hat der Kompiler die Eigenart, die Rechenoperationen in ihrer Reichenfolge manchmal umzustellen (Performance/Recourcennutzung).
    Das führt dann manchmal (fehlerhafterweise) dazu, dass der Datentype in den Zwischenrechnungen eben nicht "long long int" ist und es zu Zahlenüberläufen bei den Zwischenergebnissen kommt.

    Abhilfe:
    Caste jeden Wert in der Rechenanweisung auf "long long int" (auch die Konstanten bzw. definiere sie als solche Konstanten (ist 'eh der professionellere Weg) :cool:

    cu, das Zen

  • Bitte meine Signatur beachten :D :


    etwa so?

    long long int Index = 0;

    und
    Code: Alles markieren
    long long int usecs = ((long long int usecs)d.tv_nsec / 1000) + (d.tv_sec * 1000000);

    f=fopen("document.txt","a+");
    fprintf(f, "%d t%ll\n", Index, usecs);
    fclose(f);

    oder soll das nicht %d sein, sondern auch %ll?

    Also, ich hab nochmal nachgeschaut:
    für deinen Fall sollte es korrekt:

    Code
    unsigned long long int


    oder verkürzt:

    Code
    unsigned long long


    heissen.

    also ganz konkret:

    Code
    ...
    unsigned long long TAUSEND= 1000;
    unsigned long long MILLION= 1000000;
    
    
    unsigned long long usecs = ((unsigned long long usecs) d.tv_nsec / TAUSEND) + ((unsigned long long usecs) d.tv_sec * MILLION);
    f=fopen("document.txt","a+");
    fprintf(f, "%d  t%llu\n", Index, usecs);
    fclose(f);
    ...

    siehe dazu auch http://www.cplusplus.com/reference/cstdio/printf/ und http://www.linuxquestions.org/questions/prog…ong-int-274423/

    PS:
    Ich bin meist (bei C++) der "Nummer sicher" Typ und schreibe sogar oft den cast nochmal explicite in Klammern:

    Code
    unsigned long long usecs = (((unsigned long long usecs) d.tv_nsec) / TAUSEND) + (((unsigned long long usecs) d.tv_sec) * MILLION);

    Aber das dürfte vermutlich meist überflüssig sein... hab allerdings mit den verschiedenen Compileren schon so manche Überraschungen erlebt... :cool:

    Mfg, das Zen

  • hm, seltsam

    der Compiler erwartet, dass vor

    Code
    unsigned


    noch was steht:

    Code
    expected primary-expression before ‘unsigned’

    Die Zeile habe ich auch geschrieben:

    Code
    unsigned long long usecs = ((unsigned long long usecs ) d.tv_nsec / TAUSEND ) + ((unsigned long long usecs) d.tv_sec * MILLION));

    Jedoch kommen Fehlermeldungen:

    Code
    code.cpp:35:38: error: expected ‘)’ before ‘unsigned’
    code.cpp:35:137: error: expected ‘)’ before ‘;’ token


    Es sind doch alle Klammern da, wo sie sein sollen oder?
    Alle Fehler in der gleichen Zeile:denker:

    Einmal editiert, zuletzt von Cool_pi (28. März 2015 um 00:15)

  • Hi Cool_pi,
    meine Güte ... nun schau doch mal hin, was Du da für einen Unfug in der Zeile verzapft hast :fies:


    ...
    unsigned long long usecs = ((unsigned long long usecs ) d.tv_nsec / TAUSEND ) + ((unsigned long long usecs) d.tv_sec * MILLION));

    ...

    Code
    code.cpp:35:38: error: expected ‘)’ before ‘unsigned’
    code.cpp:35:137: error: expected ‘)’ before ‘;’ token


    ...

    da ist überhaupt nichts geheimnisvolles oder seltsames dabei ... und der Compiler sagt Dir noch dazu Zeile und Spalte der Fehler ...

    Es ist immer dasselbe: Du liest weder die Fehlermeldungen aufmerksam, noch das, was Dir gepostet wird. Du machst seit Wochen immer und immer wieder grundlegende Fehler und hast Dich da imho in keinster Weise aus Eigeninitiative ein wenig in die Problematik eingelesen.
    Du hast zwar geschrieben, dass Du in der Richtung später nichts machen willst und auch kein Interesse daran hast, was dazu zu lernen ... aber dann lass doch endlich die Finger davon und nerv' hier nicht die freiwilligen Helfer, die hier eine Menge Freizeit und Enthusiasmus investieren immer wieder mit denselben Grundlagen-Problemen.

    Statt mal die Arschbacken zusammen zu kneifen und Dich da durch zu arbeiten, wenn Du es schon nicht lassen kannst, müllst Du das Forum mit Deinen nervtötenden, ewig langen Threads voll oder gehst den Helfern mit PNs auf den Keks ...

    Ich bin mit einer der letzten, die Anfängern oder Einsteigern ihre Hilfe verweigern ... aber mit Dir macht das mittlerweile wirklich keinen Spass mehr ...

    Ich würde mir wünschen, dass Du Dich entweder jetzt endlich auf Deine Hinterbeine stellst und zusiehst Dir wenigstens das nötige Grundwissen/Grundverständnis anzueignen oder es endlich einfach sein lässt ...

    cu,
    -ds-

  • Quatsch ... der Fehler ist doch extra noch bold in meinem Post ... der springt ja förmlich ins Auge ;)
    Der Kerle ist nur zu faul, seinen eigenen Mist noch mal aufmerksam durch zu lesen ....

    cu,
    -ds-


    Entspann dich, dreamshader ;)

    Habe den Fehler gefunden :cool:

    Das hat jetzt nix mehr mit Entspannen zu tun ... ich mein' das wirklich ernst :fies:
    Du hast den Bogen einfach überspannt ...

    cu,
    -ds-

Jetzt mitmachen!

Du hast noch kein Benutzerkonto auf unserer Seite? Registriere dich kostenlos und nimm an unserer Community teil!