2009-12-29 7 views
10

Wenn ich versuche, an unsigned Ganzzahlen in MIPS zu arbeiten, bleibt das Ergebnis jeder Operation, die ich mache signiert (das heißt, die Ganzzahlen sind alle in Zweierkomplement), obwohl jede Operation ich eine vorzeichenlose bin: addu, multu und so vierte ...Warum geben MIPS-Operationen für vorzeichenlose Nummern signierte Ergebnisse?

Wenn ich Zahlen im Bereich [2^31, 2^32 - 1] drucke bekomme ich ihren "übergelaufenen" negativen Wert, als ob sie signiert waren (ich denke, sie sind).

Obwohl, wenn ich so etwas wie dies versuchen:

li $v0, 1 
li $a0, 2147483648    # or any bigger number 
syscall 

die gedruckte Zahl ist immer 2147483647 (2^31 - 1)

Ich bin verwirrt ... Was bin ich?

PS: Ich habe meinen Code nicht enthalten, da er nicht gut lesbar ist (so ist der Assembler-Code) und dieses Problem beiseite zu legen, scheint gut zu funktionieren. Wenn jemand das Gefühl hat, dass es notwendig ist, werde ich es sofort einbeziehen!

Antwort

14

Von Wikipedia:

Die Instruktion MIPS32 Zustände einstellen, dass das Wort ohne Vorzeichen als Teil hinzufügen und Anweisungen subtrahieren, ist eine falsche Bezeichnung. Der Unterschied zwischen vorzeichenbehafteten und unsignierten Versionen von Befehlen ist keine Vorzeichenerweiterung (oder deren Fehlen) der Operanden, sondern steuert, ob ein Trap bei Überlauf ausgeführt wird (z. B. Hinzufügen) oder ein Überlauf ignoriert wird (Vorzeichen ohne Vorzeichen). Ein unmittelbarer Operand CONST zu diesen Anweisungen wird immer vorzeichenerweitert.

Von den MIPS Instruction Reference:

ALL Arithmetik unmittelbare Werte sind Vorzeichen erweiterten [...] Der einzige Unterschied zwischen mit und ohne Vorzeichen Anweisungen ist, dass signierte Anweisungen eine Überlaufausnahme erzeugen kann und Befehle ohne Vorzeichen können nicht.

+0

Ich suchte überall im Netz nach einer Antwort ... überall außer dem Offensichtlichen. Vielen Dank! – dankilman

+0

Warum verwenden sie dann die Terminologie "signed and unsigned" statt "checked and unchecked"? – dan04

+0

Es ist eine falsche Bezeichnung. Lies das erste Zitat. –

1

Es sieht für mich aus wie das eigentliche Problem ist der Systemanruf, den Sie verwenden, um Zahlen zu drucken. Es scheint und interpretiert immer das, was Sie als unterzeichnet weitergeben, und möglicherweise auch zu binden.