Ich bin sehr verwirrt, wenn es so aussieht, als ob mein Code einen bestimmten Wert manchmal als signiert behandelt und manchmal als vorzeichenlos behandelt, wenn man Werte vergleicht. Woher weiß der Code, ob ein Wert signiert oder unsigniert ist?Woher weiß der Assembly-Code, ob ein Wert signiert oder unsigniert ist?
Antwort
Einige Prozessorbefehle sind signiert, einige andere nicht, wenn Sie eine Var in C deklarieren, was ein unsigned ist, wird in Assembly mit vorzeichenlosen Anweisungen kompilieren (normalerweise schneller auszuführen) Wenn Sie Assembly verwenden, werden Sie müssen die Anweisungen wählen, die Sie wirklich brauchen.
Die meisten Anweisungen (z. B. add/sub) ist es egal, und es ist die gleiche Anweisung für beide. Vielleicht denkst du an MIPS, wo es ADD vs. ADDU gibt, mit dem Unterschied, dass ADD beim Überlauf eine Ausnahme auslöst (oder so ähnlich, IIRC). Normalsigniert und Unsigned sind nur relevant für Rechtsverschiebung, Division und Voll-Multiplikation (Wort * Wort -> Doppelwort-Ergebnis). Die untere Hälfte einer Multiplikation (d. H. Bis zur gleichen Breite wie die Eingabeoperanden) ist unabhängig von Vorzeichen oder Vorzeichen die gleiche. (Für Zweierkomplement). –
@rcgldr: Ich habe alle diese Fälle in meinem Kommentar erwähnt. Ich glaube, ich meinte am meisten mit der Befehlszählung in realen Programmen, nicht mit dem Bruchteil des Befehlssatzes. Aber mein Hauptpunkt war, dass viele Anweisungen nicht signiert oder nicht signiert sind, sie sind nur Anweisungen. ** Diese Antwort scheint zu implizieren, dass Sie immer unterschiedliche Anweisungen für signiert vs. unsigned benötigen, auch für die Addition, was nicht der Fall ist. ** –
@PeterCordes - löschte meinen vorherigen Kommentar, es war für den anderen Beitrag gedacht, aber Sie habe schon darüber geredet. Ich werde diesen Kommentar später löschen. – rcgldr
Warum denken Sie, dass Assembler-Code "wissen" muss, wenn ein Wert signiert oder unsigniert ist?
Für die meisten Operationen die Ergebnisse einer signierten und einem usigned Betrieb sind die gleichen:
signed int a = 5;
signed int b = -6; // 0xFFFFFFFA
signed int c;
c = a + b; // results in -1 which is 0xFFFFFFFF
Und:
unsigned int a = 5;
unsigned int b = 0xFFFFFFFA;
unsigned int c;
c = a + b; // results in 0xFFFFFFFF
Einige Ausnahmen Teilung und Vergleiche sind. Die meisten CPUs haben in diesem Fall unterschiedliche Assembler-Anweisungen für Operationen mit und ohne Vorzeichen. Die Beispiele hier sind x86-Assembler aber msp430 sollte ähnlich sein:
signed int a, b;
if(a > b) { ... }
Ergebnisse in:
mov eax, [a]
cmp eax, [b]
jle elsePart ; Note the "L" in "jle"
Und:
unsigned int a, b;
if(a > b) { ... }
Ergebnisse in:
mov eax, [a]
cmp eax, [b]
jbe elsePart ; Note the "B" in "jbe"
Die Maschine ist es egal oder wissen, was unterzeichnet ist oder u nsigned, wenn Sie es nicht so sagen.
Auf der Ebene, wo Entwickler Entwickler wohnen, ist die Maschine ein Ziegelstein und Sie sind der Leiter. Sie müssen genug wissen, um die Verträge des Maschinenbefehlssatzes und Dinge wie flags
zu verstehen, um ein deterministisches Ergebnis zu gewährleisten.
- 1. Ist ein nackter `char32_t` signiert oder unsigniert?
- 2. Ist das msvc-Datentypwort signiert oder unsigniert?
- 3. Sind C++ enums signiert oder unsigniert?
- 4. Woher weiß ich, ob mein Ansatz gut oder schlecht ist?
- 5. Woher weiß man, ob ein Telefon angerufen wird oder nicht?
- 6. Woher weiß man, ob ein NSWindow das Frontfenster ist?
- 7. Woher weiß der Rust-Compiler, ob ein Wert verschoben wurde oder nicht?
- 8. Woher weiß ich, ob ein System eingeschaltet ist?
- 9. Woher weiß ich, ob ein Sound auf Android beendet ist?
- 10. Woher weiß man, ob der Benutzer Meilen oder Kilometer bevorzugt?
- 11. Woher weiß ich, ob ein WPF-Fenster geöffnet ist?
- 12. Woher weiß ich, ob MySQLnd der aktive Treiber ist?
- 13. Wie ermittelt man, ob eine Spalte unsigniert ist?
- 14. Bedeutet "16bit ganzzahlige PCM-Daten", dass es signiert oder unsigniert ist?
- 15. Woher weiß man, ob ein Fenster ein Kind- oder Elternfenster ist?
- 16. Woher weiß man, ob ein UITextField ein bestimmtes Zeichen enthält?
- 17. Woher weiß ich, ob ein BigDecimal nicht analysiert werden konnte?
- 18. Woher weiß ich, ob ich vom GAC laufe oder nicht?
- 19. Woher weiß man, ob ein Service-Pfad von feathersjs client ungültig ist oder nicht?
- 20. Woher weiß man, ob ein Video gesehen/versteckt wurde?
- 21. Woher weiß man, ob das Raphael-Objekt versteckt ist?
- 22. Woher weiß ich, ob ich kopieren oder verschieben?
- 23. Woher weiß man, ob ein Realm-Objekt erfolgreich aktualisiert wurde?
- 24. Woher weiß ich, ob dies eine schwache Einheit ist?
- 25. Woher weiß ich, ob das richtige .NET Framework installiert ist?
- 26. Woher weiß ich, ob dies zufällig genug ist?
- 27. Woher weiß ich, ob ein Bash-Skript mit nohup läuft?
- 28. Woher weiß man, ob ein Dialog in Android geschlossen wird?
- 29. Woher weiß ich, ob Java Stream sammeln (Collectors.toMap) parallelisiert ist?
- 30. C# process.start, woher weiß ich, ob der Prozess beendet wurde?
Wenn Sie Assemblercode schreiben, liegt es in Ihrer Verantwortung zu wissen, wann Sie welche Anweisungen verwenden. Wenn Sie in einer anderen Sprache programmieren, liegt dies in der Verantwortung des Compilers oder Interpreters, basierend auf den Datentypen, die Sie in Ihrem Code verwenden. – Michael
Abgesehen von Anweisungen, die speziell signiert oder unsigniert sind: es weiß nicht. Es ist * du *, wer den Code geschrieben hat, wer weiß. Zum Beispiel wird ein Vergleich verschiedene Flags setzen oder löschen, ohne zu wissen, ob die Verwendung dieses Bitmusters signiert oder unsigniert ist. Sie verwenden verschiedene Versionen der Verzweigungsbefehle, die verschiedene Kombinationen von Flags entsprechend Ihren Anforderungen testen. Und wenn eine Anweisung das Vorzeichen-Flag aus dem Ergebnis ms.s setzt. Bit, und Ihr Wert ist unsigned, dann ignorieren Sie es einfach. –
Können Sie mir ein Beispiel geben? – fuz