Umrechnung von "Vorzeichen und Betrag" nach Zweierkomplement

Gast #5635087
Lesenswert?
• ▲
▼
Leider gibt es noch immer Sensoren, die ihre Werte in "Vorzeichen und 
Betrag"-Darstellung (anstelle Zweierkomplement) zurück liefern.

Wie wandelt man am besten (mit wenig Zyklen, Speicher) um? Ich meine, 
man kann schnell was zusammenhacken, wie (für 16bit):
1
if (wert < 0) wert = ~wert - 32767;

Aber was ist die empfohlene Standardmethode?
#5635232
Lesenswert?
• ▲
▼
Ron schrieb:
> Wie wandelt man am besten (mit wenig Zyklen, Speicher) um?

Wenn's dir um Zyklen geht, kommt's auf den verwendeten Prozessor an.
Wieviele Millionen Mal pro Sekunde wird das denn aufgerufen?

> Ich meine, man kann schnell was zusammenhacken, wie (für 16bit):
> if (wert < 0) wert  = ~wert - 32767;

Überlauf ist für vorzeichenbehaftete Werte nicht definiert.
Ich würde den Input in einer vorzeichenlosen Variable speichern und das 
Ergebnis in einer zweiten mit Vorzeichen:
1
unsigned short input = ...;
2
short output = input & 0x7FFF;
3
if (input > 0x7FFF)
4
   output = -output;
Gast #5636566
Lesenswert?
• ▲
▼
Ron schrieb:
> Leider gibt es noch immer Sensoren, die ihre Werte in "Vorzeichen und
> Betrag"-Darstellung (anstelle Zweierkomplement) zurück liefern.
>
> Wie wandelt man am besten (mit wenig Zyklen, Speicher) um? Ich meine,
> man kann schnell was zusammenhacken, wie (für 16bit):
>
1
if (wert < 0) wert = ~wert - 32767;
>
> Aber was ist die empfohlene Standardmethode?

Eine empfohlene Standardmethode kann es naturgemäß nicht geben, wenn es 
um "nichtstandard"-Binär-Representationen geht. Die optimale Methode 
hängt dann natürlich von der konkreten Representation und der konkreten 
Maschine ab, auf der die Wandlung durchgeführt werden soll. Sprich: 
Assembler rules. Jedenfalls dann, wenn die Wandlung mit (beweisbar) 
optimaler Geschwindigkeit erfolgen soll.

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.