longint highbyte und lowbyte direkt ansprechen in C

Gast #494627
Lesenswert?
• ▲
▼
Das Übliche: Nimm eine union. Wenn Du mit Low- und High-"Byte" die 
oberen und unteren 16 Bit meinst (wobei 16 Bit aber 2 Bytes sind!), dann 
ganz kurz:
1
union
2
{
3
    unsigned long wert;
4
    unsigned int wert_hl[2];
5
}
Oder mit Maskierung.
Gast #494689
Lesenswert?
• ▲
▼
Wenn man a als int und nicht als long int deklariert, dann ja. 
Allerdings ist ein sicheres Funktionieren nur mit unsigned-Variablen 
gewährleistet. Je nachdem, was der Compiler aus dem Vorzeichen-Bit 
macht, kann sonst eventuell Murks rauskommen...
#494737
Lesenswert?
• ▲
▼
Das (char) ist ein sog. 'cast'

Also:

* Zerlegen

  int i;
  uint8_t LowByte, HighByte;

  LowByte = (uint8_t) i;
  HighByte = (uint8_t)( ((uint16_t)i) >> 8 );

* Zusammensetzen

  int i;
  utin8_t LowByte, HighByte;

  i = (int)( HighByte << 8 | LowByte );

Am besten macht man sich dafür ein paar Makros oder
inline Funktionen

#define LOW(x)       ((uint8_t)(x))
#define HIGH(x)      ((uint8_t)(((uint16_t)(x)) >> 8)
#define TOWORD(x,y)  (((x) << 8) | y)

  int i, j;
  uint8_t LowByte, HighByte;

  LowByte = LOW(i);
  HighByte = HIGH(i);

  j = TOWORD(HighByte, LowByte);
Gast #494753
Lesenswert?
• ▲
▼
@ Karl heinz Buchegger
was macht der 'cast' ich kapier das nicht.

@all
Ich habe mal 3 Funktiionen gebaut wäre schön wenn jemand mal 
drüberschauen könnte, ob die so in Ordnung sind.

Vielen Dank schonmal!


uint8_t highbyte(uint16_t a){return (uint8_t)(a>>8);}
uint8_t lowbyte(uint16_t a){return (uint8_t)a;}
uint16_t word(uint8_t a,uint8_t b){return (uint16_t)(a << 8 | b );}
#494802
Lesenswert?
• ▲
▼
@Buchegger

>#define TOWORD(x,y)  (((x) << 8) | y)

Solltest Du hier nicht erst auf 16Bit casten, bevor Du schiebst?

1
#define TOWORD(x,y)  (((uint16_t)x << 8) | y)

@Pluto
Ich würde Makros, wie die Buchegger vorschlägt verwenden statt 
Funktionen. Funktionen sind etwas langsamer, wegen dem Function-Call 
Overhead.

>uint16_t word(uint8_t a,uint8_t b){return (uint16_t)(a << 8 | b );}

Allenfalls müsstest Du vor dem Links shiften ebenfalls auf 16Bit casten 
und die Klammern anderst setzen. (Sicher ist sicher)

1
uint16_t word(uint8_t a,uint8_t b){return (uint16_t)(((uint16_t)a << 8) | b );}


Gast #494817
Lesenswert?
• ▲
▼
@Peter:
Berechnungen werden doch standardmäßig eh in 16 Bit durchgeführt, 
solange nichts anderes angegeben ist. Den cast nach uint16_t kann man 
sich also sparen.

@Pluto:
> was macht der 'cast' ich kapier das nicht.
Der cast sorgt dafür, dass das Ergebnis der Berechnung (das ja immer 
noch ein 16-Bit-Wert ist) als 8-Bit-Wert zurückgegeben wird. Du willst 
ja aus einem 16-Bit-Wert 2 8-Bit-Werte machen. Ohne den cast vor dem 
return wäre der Rückgabewert ein uint16_t und es würde eine 
Fehlermeldung geben, dass der Typ des Rückgabewertes (also uint16_t) 
nicht mit dem in der Funktionsdeklaration vereinbarten (also uint8_t) 
übereinstimmt. Beim cast von 16-Bit-unsigned int-Variablen auf 
8-Bit-unsigned int werden die 8 MSB des 16-Bit-int abgeschnitten und nur 
die 8 LSB bleiben übrig. Ich hoffe, die Erklärung war jetzt nicht zu 
unverständlich. Wie casts generell funktionieren (und auch wann sie 
nicht funktionieren) solltest Du im C-Buch Deines Vertrauens mal 
nachlesen.
Gast #494831
Lesenswert?
• ▲
▼
"short, also 16 Bit."

Wobei short vorzeichenbehafet ist. Wenn dir klar ist, was das bedeutet, 
ist es gut, sonst nimm lieber das auch in den Beispielen genannte 
unsigned short bzw. uint16_t.

Oliver

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.