Wort invertieren und negativ darstellen

Gast #1792159
Lesenswert?
• ▲
▼
Hallo,
ich habe mnal wieder ein Problem und versuche die ganze Zeit schon eine 
Lösung zu finden.

0x025B sind 603
und
0xFFD6 sind -42


Diese beiden Referenzwerte habe ich aus einer SPS-Anlage ausgeschrieben. 
Die sind wirklich so!

Meine Funktion zum zusammenfügen der beiden Bytes sieht bis jetzt so 
aus:

zahl = bytes_verunden(d1, d2);

int bytes_verunden(int MSB, int LSB)
{
  int VALUE;
  VALUE = LSB << 8 | MSB;
  return VALUE;
}

Mit positiven Zahlen klappt alles super, sobald es negativ wird, kommen 
aber falsche Werte raus.

Ich muss also ab dem größtmöglichen Positiven Wert (dann ist die Zahl ja 
negativ) etwas anders machen. Aber was?
Gast #1792163
Lesenswert?
• ▲
▼
>Mit positiven Zahlen klappt alles super, sobald es negativ wird, kommen
>aber falsche Werte raus.

Es sind ja auch vorzeichenbehaftete Werte.
Übringens sind es keine Bytes...
Was willst du überhaupt mit den Werten machen? Was soll am Ende dabei 
herauskommen?
#1792175
Lesenswert?
• ▲
▼
Grundregel Nummer 1:

Wenn du auf Byte oder Wort-Ebene arbeitest, dann willst du alles 
mögliche haben, aber AUF KEINEN FALL EINEN C-DATENTYP MIT EINEM 
VORZEICHEN.

Um auf dieser Ebene zu arbeiten willst du weder
  char, signed char, int, signed int, long, signed long, double, float
benutzen.

Sondern du arbeitest ausschliesslich mit

   unsigned char
   unsigned int
   unsigned long

Alles andere kannst du vergessen, weil dir das bei allen signed 
Datentypen gebräuchliche Vorzeichen-Bit in der 2-er 
Komplementdarstellung, bei jeglichen Bitoperationen immer in die Quere 
kommt!
Gast #1792198
Lesenswert?
• ▲
▼
Die Bezeichner und die Reihenfolge kommt nicht von mir. Die habe ich vom 
TE übernommen und da es bei unsigned vorher so klappte, stammt die 
falsche Bezeichnung vom TE. Von der reinen Operation ist es so bei ihm 
funktionsfähig, aber falsch benannt.
#1792227
Lesenswert?
• ▲
▼
*GAST* schrieb:
> int bytes_verunden(int MSB, int LSB)
> {
>   int VALUE;
>   VALUE = LSB << 8 | MSB;
>   return VALUE;
> }

Die Funktion ist im Prinzip richtig, der Fehler passiert nämlich schon 
vorher.
Die Funktion will 2 int und nicht 2 char. D.h. beim Aufruf müssen Deine 
char erstmal nach int erweitert werden und da passiert das Unglück.
Aus einem 0x80 wird dann 0xFF80.

Schreib die Funktion um auf unsigned char Argumente und alles ist in 
Butter.

Generell sollte man für Variablen immer das kleinst nötige Format 
nehmen.


Peter

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.