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

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren