Frage zu int und unsigned int



  • Hallo, ich versuche mich gerade mit den Sprüngen in Assembler dort gibt es ja vorzeichenlos also unsigned und vorzeichenbehaftet also sign .

    bei einem unsigned int ist der kleinste wert ja 0 .
    also wenn man 5 - 10 berechnet müsste ja 0 rauskommen oder?

    weil irgendwie bekomm ich immer -5.

    gruß peer



  • peerffm schrieb:

    bei einem unsigned int ist der kleinste wert ja 0 .
    also wenn man 5 - 10 berechnet müsste ja 0 rauskommen oder?

    Nein. Beim kleinsten Wert ist nicht "Anschlag". Es findet ein Unterlauf statt.



  • also wenn ich bsp ein Programm hätte das folgendes Fragen würde.

    -1 wenn x < y
    0 wenn x==y
    1 wenn x>y

    dann würde das so richtig in assembler aussehen

    wenn x ein unsigned ist und y ein sign

    pushl %ebp
    movl %esp, %ebp
    movl 8(%ebp),%eax
    cmpl $0,12(%ebp)
    jl .greater
    cmpl 12(%ebp),%eax
    jb .less
    cmpl 12(%ebp),%eax
    ja .greater
    ansonsten geht es zu x==y

    trotdem funktioniert auch cmpl 12(%ebp),%eax
    jl .less
    cmpl 12(%ebp),%eax
    jg .greater
    was ja falsch wäre und nur richtig im fall wenn x und y beides sign wären



  • cmp macht immer 'ne signed-integer subtraktion und setzt darauf hin ein paar flags.
    btw: das leben ist zu kurz um in asm zu programmieren 😉



  • also wäre beides richtig?



  • peerffm schrieb:

    also wäre beides richtig?

    wenn's so funktioniert dann ja.

    wenn du die variablen in eimen c-programm als 'unsigned' definiert hast, dann musste sie in deinem asm-code auch so behandeln. behandelst du sie, als wären sie vorzeichenbehaftet, dann bekommste u.u. ein falsches ergebnis. dem 'cmp'-befehl ist das wurscht. entscheidend ist, wie du die flags danach abfragst und weitermachst...
    🙂



  • ok vielen dank für deine Antwort.

    wie wäre es dann bei einem long ?

    muss mich gerade mit assembler in ingeneurwissenschaftliche grundwissen 3 im Grundstudium beschäftigen.



  • peerffm schrieb:

    wie wäre es dann bei einem long ?

    Hamlet würde sagen :

    char, int, short, long ????

    SIGNED oder UNSIGNED, das ist hier die Frage !

    Hier nochmal die Sprungbedingungen :

    name  beschreibung               springt wenn 
    ----------------------------------------------
    JB    Jump if Below              CF=1
    JA    Jump if Above              CF=0 and ZF=0
    
    JL    Jump if Less    (signed)   SF != OF
    JG    Jump if Greater (signed)   ZF=0 and SF=OF
    

    Das OF wird gesetzt wenn bei einer arithmetischen Operation ein Übertrag auf das höchstwertige Bit erfolgt (z.B. bei SUB) oder erfolgen würde (z.B. bei CMP).

    Der Übertrag entsteht entweder weil das Ergebnis so gross ist, dass das höchstwertige Bit mit gesetzt werden muss, oder weil das Ergebnis negativ ist.

    Wenn man JL, JG mit UNSIGNED benutzt, kommt man deshalb u.U. zu falschen Interpretationen (z.B. springt zwar, aber nicht im Sinne der Beschreibung).

    Deshalb JL, JG immer bei SIGNED und JB, JA immer bei UNSIGNED.


Anmelden zum Antworten