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>ydann 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==ytrotdem 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.