Hallo kurze Frage ich möchte die zwei 8bit-Zahlen in eine 16-bit Zahl wandeln. ist das so richtig, leider kann ich in meinem Programm nicht kontrollieren obs stimmt.
1 | |
2 | |
MfG
|
Anzeige
|
2 8bit in eine 16bit ZahlHallo kurze Frage ich möchte die zwei 8bit-Zahlen in eine 16-bit Zahl wandeln. ist das so richtig, leider kann ich in meinem Programm nicht kontrollieren obs stimmt.
MfG
Gast
#2294437
Falls das C sein soll: Ohne Type cast ist das wahrscheinlich falsch. Außerdem kann Schieben je nach Prozessor recht ineffizient sein. Einfacher ist es mit einer union ja ,sorry das ist C. Hab mich jetzt mal bissel bei sprut belesen. Aber ich versteh noch nicht ganz wie ich die zwei byte jetzt quasi zu einem Word machen kann. wenn ich das eine byte beschreibe und danach das zweite dann hab ich doch das erste wieder überschrieben? wäre es vielleicht so richtig
Gast
#2294445
union _Word
{
int Ergebnis;
struct
{
char ECCPR1L;
char ECCPR1H;
};
}Speicher;
int Test;
Speicher WordVariable;
char Var1;
char Var2;
WordVariable.ECCPRIL = Var1;
WordVariable.ECCPRIH = Var2;
Test = WordVariable.Ergebnis;
Michael schrieb: > Außerdem kann Schieben je nach Prozessor recht ineffizient sein. Stimmt, aber vermutlich wird kaum ein Compiler das als 8 left-shifts umsetzen Christoph Herzog schrieb: > wäre es vielleicht so richtig > >
Das kann funktionieren. Wenn der verwendete Prozessor ein Little-Endian ist. (Ist inzwischen fast von auszugehen, aber es wird im Originalpost nicht erwähnt) Prinzipiell gefällt mir die ursprüngliche Variante am besten, es muss eben nur ein typecast rein:
ich möchte nicht klugschei.... weil ich davon noch absolut keine ahnung hab, aber ist das so richitg
"Speicher" ist doch der Name und _Word der Typ oder? allerdings funktioniert
auch nicht:-( Klaus T. schrieb: > Ergebnis = ((uint16_t) high << 8) | low Könnteste du das bitte ein wenig näher erklären. wofür steht das uint16_t und | ist ein oder? quasi um den untern teil der 16 bit zubeschreiben? vielen dank
Gast
#2294463
Christoph Herzog schrieb: > und | ist ein oder? quasi um den untern teil der 16 bit zubeschreiben? C-Grundlagen lernen!! > ECCPR1L klingt nach Hardware-Register, das geht nicht mit union habt ihr einen Link wo ich mir die Grundlagen mal bissel aneignen kann. bis jetzt hab ich nur sprut und pic-projekte.de entdeckt. oki das |ist quasi ein bitweises oder und ja es geht um Hardware-register.
Gast
#2294469
Warum muß das hier denn alles so kompliziert gelöst werden ?? Du definierst eine unsigned int-Variable namens Ergebnis und baust diese dann aus den beiden 8-Bit Werten wert1 (High-Byte) und wert2 (Low-Byte) zusammen: unsigned int Ergebnis; Ergebnis = wert1 * 256 + wert 2; // Fertig !! Das kann jeder C-Compiler der Welt verarbeiten. Gute Compiler machen aus dem Teil ´* 256´ dann noch automatisch ein Links-Shift, weil das dann schneller geht als die echte Multiplikation, also Ergebnis = (wert1 << 8) + wert2; Womit wir dann wieder beim Anfang des Threads sind, der doch richtig war !! Nur Ergbnis muß als unsigned int def. werden Schieber
Gast
#2294587
@Christoph Herzog Vielleicht ist mein kostenloser Grundlagen-C-Kurs etwas für Dich http://et-tutorials.de/mikrocontroller/
Gast
#2294613
Moin, wieso reicht dir das Angebot nicht? Hier gibt es einen PIC(18) Tutorial: http://pic-projekte.de/pic_tutorial.html Und hier eins für PIC Programmierung in C: http://pic-projekte.de/pic_c.html Gruß Andreas Wenn du dir mal die Links anschaust: http://pic-projekte.de/pic_c.html#8to16 da steht: "Zwei 8-Bit Variablen in eine 16 Bit umwandeln" und darunter ein fertiger Code für C18.
Gast
#2294845
Alles beschrieben funktioniert natürlich nur mit vorzeichenlosen Werten. Die union Konstruktion funktioniert nicht mit Hardware variablen, da in der struct ja nur neue Namen vergeben werden. Sind die schon belegt, meckert der Compiler. Schneller ist die union allemal. Aber auch wenn der Compiler x*256 zu x<<8 optimiert, so wird er doch Probleme haben, das + zu optimieren. Je nach CPU ist | bedeutend schneller als +, wobei in diesem speziellen Fall beide Operationen zum gleichen Ergebnis führen. Also lieber: Ergebnis = (((uint16_t) high) << 8) | low; Es ist ausserdem wichtig, dass "high" zuerst in eine 16 bit Zahle gewandelt wird, und dann erst nach links geshiftet wird. Daher nochmal zwei Klammern (auch wenn sie nicht unbedingt nötig wären).
Gast
#2294884
Ähm Leute:
Das H und das L impliziert doch, das ein HIGH und ein LOW Register ist. Und da gehe ich davon aus, dass es auch ein 16bit-Pondon gibt:
Der Compiler kümmert sich dann schon. Antwort schreibenBitte melde dich an, um einen Beitrag zu schreiben. |
Anzeige
|