Forum: Compiler & IDEs Umrechnung von "Vorzeichen und Betrag" nach Zweierkomplement


von Ron (Gast)


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?

von Rolf M. (rmagnus)


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;

von c-hater (Gast)


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.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.