Aus 2 char ein unsigned int erzeugen

Gast #586368
Lesenswert?
• ▲
▼
Hallo @ all

Ich möchte Daten von den Ports einlesen. Der Datenbus ist 8 Bit breit. 
Zuerst übertrage ich das Low-Byte und anschließend das High-Byte. Danach 
möchte ich das Low-Byte und High-Byte zusammenfassen zu einem unsigned 
int. Hier mein Quellcode:

bit status;
char low_byte, high_byte;


if(status == LOW_BYTE)
{
   low_byte = PINC;
   status = HIGH_BYTE;
}
else
{
   high_byte = PINC;

   ptr_datenpuffer[i] = high_byte;
   ptr_datenpuffer[i] = ptr_datenpuffer[i] << 8;
   ptr_datenpuffer[i] = low_byte;

   status = LOW_BYTE;
}

Ich dachte das durch die Wertzuweisung die unteren 8 Bits des unsigned 
int beschrieben werden. Anschließend wollte ich das ganze um 8 Stellen 
nach links schieben und dann das Low-Byte zuweisen. Dies scheint so aber 
nicht zu funktionieren

Grüsse

Sebastian
Gast #586679
Lesenswert?
• ▲
▼
ptr_datenpuffer[i] = (((int) high_byte )<<8) | low_byte;

Wieso muss der Datentyp vom low_byte nicht verändert werden? Schließlich 
führe ich doch eine Veroderung von zwei unterschiedlichen Datentypen 
durch.

Grüsse

Sebastian
Gast #586687
Lesenswert?
• ▲
▼
Vorschlag: ausschießlich unsigned verwenden, zb so:
1
bit status;
2
unsigned char low_byte, high_byte;
3

4
// unsigned short ptr_datenpuffer[300];
5

6
if(status == LOW_BYTE)
7
{
8
   low_byte = PINC;
9
   status = HIGH_BYTE;
10
}
11
else
12
{
13
   high_byte = PINC;
14
   ptr_datenpuffer[i] = (high_byte<<8)+low_byte;
15
   status = LOW_BYTE;
16
}

  
Admin Persönliche Seite #586825
Lesenswert?
• ▲
▼
Thorsten De buhr wrote:
> int intvalue=0;
> char *low_byte = (char*) &intvalue;
> char *high_byte = (char*) (&intvalue)+1;

Auch das ist nicht portabel. Je nach Prozessor kann es sein dass das 
low_byte hier gar nicht das low byte ist, sondern das high byte.

> Schneller gehts nicht, weil hier nicht gerechnet werden muss. Die ARMs
> haben idR. nen Barrelshifter drin, so dass man da in einem Takt bis zu
> 32Bit shiften kann. Die AVRs glaub ich nicht...

Der Compiler setzt das beim AVR in zwei Byte-Zugriffe um, geschoben wird 
da gar nicht.
Gast #586864
Lesenswert?
• ▲
▼
>> int intvalue=0;
>> char *low_byte = (char*) &intvalue;
>> char *high_byte = (char*) (&intvalue)+1;

>Auch das ist nicht portabel. Je nach Prozessor kann es sein dass das
>low_byte hier gar nicht das low byte ist, sondern das high byte.

Das was Thorsten vorgeschlagen hat, macht doch eigentlich der Compiler, 
wobei dieser dann auch die richtige Zuordnung (Position der Bytes) 
trifft, oder?

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.