www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik INT16 in 2 mal int8 aufsplitten


Autor: Alexander Pet (Firma: htl) (alex90)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo !

ICh programmiere in MPLab(C) und habe folgendes Problem..

Ich habe ein INT16 und will dieses in 2 neue int8 aufsplitten ...
dh itn a sind beispielsweiße die oberen 8 bit und int b die letzteren 
8bit ..


Habt ihr Ideen/Vorschläge wie ich dies realisieren kann ??

danke im voraus

Gruss Alex

: Verschoben durch Moderator
Autor: Olaf Stieleke (olaf2001)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Kenn mich mit MPLab nicht aus, aber der übliche Weg ist:

intb=int16 & 0xFF; //oberen 8 Bit wegmaskieren
inta=int16 >> 8;

Autor: Alexander Pet (Firma: htl) (alex90)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Super danke für die schnelle antwort;)

Autor: Heinz Heizer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Oder mit union.
Das sollte auch funktionieren.

Autor: Sven P. (haku) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Heinz Heizer schrieb:
> Oder mit union.
> Das sollte auch funktionieren.

Das geht schief, wenn man nicht weiß, auf welcher Endianness man 
arbeitet, oder wenn der Quelltext portabel sein soll.

Autor: Frank M. (ukw) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Olaf Stieleke schrieb:
> Kenn mich mit MPLab nicht aus, aber der übliche Weg ist:
>
> intb=int16 & 0xFF; //oberen 8 Bit wegmaskieren
> inta=int16 >> 8;

Das ist suboptimal, da ints vorzeichenbehaftet sind. Da kann intb schon 
mal negativ werden (oberstes Bit gesetzt). inta sowieso, aber nur dann, 
wenn int16 auch negativ ist - was ja vielleicht gewollt ist.

Handelt es sich um grundsätzlich positive Werte, sollte man auch 
unsigned-Typen wählen.

Gruß,

Frank

Autor: Werner B. (werner-b)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Etwas Offtopic:

Bei AVRGCC/WinAVR wird kürzerer Coder erzeugt wenn man bei 
Optimierungsstufe -Os statt
inta=int16 >> 8;
inta=(int16 & 0xFF00) >> 8;
verwendet. Das Erste wird in in acht Schieboperationen übersetzt und 
dann der Wert nach inta kopiert, beim Zweiten wird direkt das High-Byte 
nach inta kopiert.

Autor: Frank M. (ukw) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Werner B. schrieb:
> Etwas Offtopic:
>
> Bei AVRGCC/WinAVR wird kürzerer Coder erzeugt wenn man bei
> Optimierungsstufe -Os statt
>
>
> inta=int16 >> 8;
> 
>
> inta=(int16 & 0xFF00) >> 8;
> 
> verwendet.  Das Erste wird in in acht Schieboperationen übersetzt und
> dann der Wert nach inta kopiert, beim Zweiten wird direkt das High-Byte
> nach inta kopiert.

Das stimmt so nicht. Jedoch hast Du teilweise recht: Das Rechts-Schieben 
von vorzeichenbehafteten ints bringt öfters andere Ergebnisse, als man 
erwartet. Hier ein Auszug aus dem lss-File des WinAVR-Compilers:

-------------------------------------------------------------
A:
int8_t
xyz (int16_t i16)
{
  int8_t i8;

  i8 = i16 >> 8;
  return (i8);
}

Ergebnis:

  70:  89 2f         mov  r24, r25
  72:  99 0f         add  r25, r25
  74:  99 0b         sbc  r25, r25
  76:  08 95         ret
-------------------------------------------------------------
B:

int8_t
xyz (int16_t i16)
{
  int8_t i8;

  i8 = (i16 & 0xFF00) >> 8;
  return (i8);
}

  70:  89 2f         mov  r24, r25
  72:  08 95         ret
-------------------------------------------------------------
C:

uint8_t
xyz (uint16_t i16)
{
  uint8_t i8;

  i8 = i16 >> 8;
  return (i8);
}

  70:  89 2f         mov  r24, r25
  72:  08 95         ret
-------------------------------------------------------------

Deswegen schrieb ich ja: Beim Schieben von Ganzzahlen ist es meist 
sinnvoll, unsigned-Typen zu verwenden.

Woran liegt das? Wenn man negative Werte nach rechts schiebt, muss das 
Vorzeichen erhalten bleiben.

Beispiel (unter Linux übersetzt):

#include <stdio.h>
#include <inttypes.h>

main ()
{
  char i = 0x80;

  i >>= 1;

  printf ("%d\n", i);
}

Das Ergebnis ist -64, also binär 11000000. Aus 1 Vorzeichen-Bit werden 
plötzlich 2 Einsen, siehe Zweierkomplement.

Gruß,

Frank

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.