Überlauf von usigned long int? Große Zahlen verarbeiten schlägt fehl.



  • dachschaden schrieb:

    Beispiel: 01111111 (127) läuft über, raus kommt 10000000. Was ist das jetzt?

    Wenn 127 überlaufen soll, betrachtest du nur die ersten 7 Bits um den Überlauf festzustellen. Ist doch gar nicht so schwer. Mit dem Zweierkomplement hat das immer noch nichts zu tun. 🙂



  • Andromeda schrieb:

    Wenn 127 überlaufen soll, betrachtest du nur die ersten 7 Bits um den Überlauf festzustellen.

    Bitweise Operationen auf vorzeichenbehaftete Werte sind implementationsabhängig beziehungsweise undefiniert.



  • SeppJ schrieb:

    zufallswert schrieb:

    Andromeda schrieb:

    Was wirklich schade ist und die Frage aufwirft, wieso der C-Standard so viele Freiheiten lässt.

    weil Maschinen denkbar sind, die signed integers nicht im 2-Komplement kodieren.

    Und es verhindert Optimierungen, wie die von mir gezeigte. (a+b)<a nach b < 0 optimieren zu können ist eine sehr mächtige Optimierung, weil man viel weniger Anweisungen hat. Sich das (und viele andere Optimierungen) zu verbauen wäre dumm. Aber das weißt du ja sicher mit deiner vielen Praxiserfahrung 🙄

    Nein, weiß ich nicht. Erklär mal 😋


  • Mod

    zufallswert schrieb:

    SeppJ schrieb:

    zufallswert schrieb:

    Andromeda schrieb:

    Was wirklich schade ist und die Frage aufwirft, wieso der C-Standard so viele Freiheiten lässt.

    weil Maschinen denkbar sind, die signed integers nicht im 2-Komplement kodieren.

    Und es verhindert Optimierungen, wie die von mir gezeigte. (a+b)<a nach b < 0 optimieren zu können ist eine sehr mächtige Optimierung, weil man viel weniger Anweisungen hat. Sich das (und viele andere Optimierungen) zu verbauen wäre dumm. Aber das weißt du ja sicher mit deiner vielen Praxiserfahrung 🙄

    Nein, weiß ich nicht. Erklär mal 😋

    Nur Vollprofis mit jahrelanger Praxiserfahrung, wie Andromeda, könnten adäquat erklären, wieso es besser ist, allgemein schnell zu sein, anstatt irgendeinem 12-Jährigen seinen schlecht programmierten Overflowtest zu lassen.



  • dachschaden schrieb:

    Andromeda schrieb:

    Wenn 127 überlaufen soll, betrachtest du nur die ersten 7 Bits um den Überlauf festzustellen.

    Bitweise Operationen auf vorzeichenbehaftete Werte sind implementationsabhängig beziehungsweise undefiniert.

    Aber das geht:

    #include <stdio.h>
    #include <limits.h>
    
    void signed_addition_would_overflow(char a, char b) // oder underflow
    {
        printf ("Overflow? %d + %d --> ", a,b);
        if ((a>0 && b > CHAR_MAX-a) || (a<0 && b < CHAR_MIN-a))
            puts ("Yepp!");
        else
            puts ("Nope!");
    }
    
    int main()
    {
        int a, b;
        for (a=-128; a<128; a++)
            for (b=-128; b<128; b++)
                signed_addition_would_overflow((char)a, (char)b);
    }
    

    ^^ Lässt sich leicht für int, long usw. umstricken. 🙂



  • Andromeda schrieb:

    Aber das geht:

    Oder du verwendest gleich die von mir verlinkten Builtins:

    <signed_addition_would_overflow>:
    cmp    dil,0x0
    jle    4005e0 <signed_addition_would_overflow+0x20>
    movsx  edi,dil
    mov    eax,0x7f
    movsx  esi,sil
    sub    eax,edi
    cmp    esi,eax
    setg   al
    movzx  eax,al
    ret    
    xchg   ax,ax
    mov    eax,0x0
    je     4005fe <signed_addition_would_overflow+0x3e>
    movsx  edi,dil
    mov    eax,0xffffff80
    movsx  esi,sil
    sub    eax,edi
    cmp    esi,eax
    setl   al
    movzx  eax,al
    repz ret
    

    Vs.

    <better_signed_overflow>
    movsx  esi,sil
    movsx  edi,dil
    xor    eax,eax
    add    dil,sil
    seto   al
    ret    
    nop    WORD PTR cs:[rax+rax*1+0x0]
    
    nop    DWORD PTR [rax+rax*1+0x0]
    

    Oder, hey, ich habe noch 'ne viel bessere Idee: verwende einfach keine vorzeichenbehafteten Indizes. Wenn du in deinem Protokoll so weit gehen musst, negative Indizes zu benutzen, dann ist dein Protokoll absoluter Schrott und gehört wie wahrscheinlich auch deine ganze bisherige Arbeit verbrannt, in einen Glassarg verpackt und dem Ozean für alle Zeiten anvertraut.

    EDIT: Satz neu formuliert, war scheiße.



  • dachschaden schrieb:

    Andromeda schrieb:

    Aber das geht:

    Oder du verwendest gleich die von mir verlinkten Builtins:

    <signed_addition_would_overflow>:
    cmp    dil,0x0
    jle    4005e0 <signed_addition_would_overflow+0x20>
    movsx  edi,dil
    mov    eax,0x7f
    movsx  esi,sil
    sub    eax,edi
    cmp    esi,eax
    setg   al
    movzx  eax,al
    ret    
    xchg   ax,ax
    mov    eax,0x0
    je     4005fe <signed_addition_would_overflow+0x3e>
    movsx  edi,dil
    mov    eax,0xffffff80
    movsx  esi,sil
    sub    eax,edi
    cmp    esi,eax
    setl   al
    movzx  eax,al
    repz ret
    

    Vs.

    <better_signed_overflow>
    movsx  esi,sil
    movsx  edi,dil
    xor    eax,eax
    add    dil,sil
    seto   al
    ret    
    nop    WORD PTR cs:[rax+rax*1+0x0]
    
    nop    DWORD PTR [rax+rax*1+0x0]
    

    Oder, hey, ich habe noch 'ne viel bessere Idee: verwende einfach keine vorzeichenbehafteten Indizes. Wenn du in deinem Protokoll so weit gehen musst, negative Indizes zu benutzen, dann ist dein Protokoll absoluter Schrott und gehört wie wahrscheinlich auch deine ganze bisherige Arbeit verbrannt, in einen Glassarg verpackt und dem Ozean für alle Zeiten anvertraut.

    EDIT: Satz neu formuliert, war scheiße.

    Junge, lass die Drogen weg. 😃



  • Andromeda schrieb:

    Junge, lass die Drogen weg. 😃

    Hör du auf, mit sinnloser Scheiße um die Ecke zu kommen. Deine Inkompetenz macht einen schlechten Eindruck auf das gesamte Forum.



  • Dazu passt sehr schön eines deiner eigenen Postings, wenn ich zitieren darf:

    Weniger Geld für Schnaps, Koks und Nutten ausgeben soll angeblich Wunder bewirken.



  • Ist egal.



  • LOLAlter schrieb:

    Dazu passt sehr schön eines deiner eigenen Postings, wenn ich zitieren darf:

    Weniger Geld für Schnaps, Koks und Nutten ausgeben soll angeblich Wunder bewirken.

    Früher war das hier ein cooles Forum. Heute benutzen es nur noch einige arrogante Schweine, um Neulingen in die Fresse zu treten.



  • Historiker schrieb:

    Früher war das hier ein cooles Forum. Heute benutzen es nur noch einige arrogante Schweine, um Neulingen in die Fresse zu treten.

    Verzeih mir, wenn ich dir diese Geschichte nicht abkaufe. Wenn du bereits einen solch zweifelhaften Eindruck von der Realität besitzt, dann wird es um die gespeicherte Gegenwart - also die Vergangenheit - nur noch schlechter stehen. Ich stehe nicht darauf, Neulingen in die Fresse zu treten. Ich stehe darauf, Faulpelzen in die Fresse zu treten. Aber mit Wonne und Karacho.

    Ich könnte auch antworten: "Früher war alles besser!!1!", aber damit habe ich zu einfach zu oft recht.


Anmelden zum Antworten