Hallo, kann mir jemand erkären was hier in welcher Reihenfolge passiert?
1 | DEECON = (unsigned char) ((adr>>8)&0x01); |
Grüße
|
Forum: Mikrocontroller und Digitale Elektronik Befehl in C (Bitmanipulation)Hallo, kann mir jemand erkären was hier in welcher Reihenfolge passiert?
Grüße adr um 8 Bit nach recht schieben Ergebnis mit 0x01 UND-verknüpfen Ergebnis auf unsigned char casten und DEECON zuweisen "adr" wird um 8 Bits nach rechts geshifted, was gleichbedeutend ist mit einer Division durch 256. Das Resultat wird mit der Konstanten 1 verANDet. Und das Resultat davon wiederum wird nach "unsigned char" gecastet und dann etwas namens "DEECON" zugewiesen. Aufgrund der verANDung mit 1 gibt es hier nur zwei Möglichkeiten: 0 oder 1. Hallo, da wir den Datentyp von adr nicht kennen, ist es auch möglich ein anderes Ergebnis zu erhalten ! Genau dann wenn - habe ich lange nicht mehr geschrieben -, wenn adr von Typ uint8_t ist =0, oder mit dem Datentyp int8_t =1 . Rufus Τ. F. schrieb: > Aufgrund der verANDung mit 1 gibt es hier nur zwei Möglichkeiten: 0 oder > 1. Dachte ich mir auch so, warum hat da aber jemand die Shift-Operation eingesetzt. Das Ergebnis sollte doch identisch sein mit
@HildeK (Gast) >>DEECON = (unsigned char) ((adr>>8)&0x01); >DEECON = (unsigned char) (adr&0x01); Über den Unterschied denken wir nochmal nach . . . :
Bearbeitet durch User
Karl M. schrieb: > da wir den Datentyp von adr nicht kennen, ist es auch möglich ein > anderes Ergebnis zu erhalten ! Nö. Das Ergebnis kann nur 0 oder 1 sein, völlig unabhängig vom Datentyp von "adr". Rufus Τ. F. schrieb: > Karl M. schrieb: >> da wir den Datentyp von adr nicht kennen, ist es auch möglich ein >> anderes Ergebnis zu erhalten ! > > Nö. Das Ergebnis kann nur 0 oder 1 sein, völlig unabhängig vom Datentyp > von "adr". Schon richtig, aber es darf debattiert werden, unter welchen Bedingungen abhängig von adr das Ergebnis 0 oder 1 ist! Sieh Dir z.B. die folgenden Fälle an: char adr = 0xff; // DEECON = 0 short adr = 0xff; // DEECON = 0 short adr = 0xff00; // DEECON = 1 Da ein Byte immer 8 bit ist und somit eine right shift um 8 IMMER alle bits eines Bytes unter den Tisch fallen lässt (mal angenommen die Shift Operation ist kein rotate, in welchem Fall noch Fallunterscheidungen zwischen signed und unsigned gemacht werden müssen), können wir davon ausgehen, dass adr mindestens 16 bit breit ist, sonst wäre die fn ein immer konstant 0. gnugnu schrieb: > char adr = 0xff; // DEECON = 0 > short adr = 0xff00; // DEECON = 1 The result of E1 >> E2 is E1 right-shifted E2 bit positions. [...] If E1 has a signed type and a negative value, the resulting value is implementation-defined. [ISO/IEC 9899, § 6.5.7 Bitwise shift operators] Falk B. schrieb: > Über den Unterschied denken wir nochmal nach . . . Tu ich - und schäme mich auch schon :-) Die Anweisung macht nur dann Sinn, wenn adr wenigstens 16 Bit hat. Andernfalls ist das Ergebnis vorhersehbar 0. Übliche Compiler machen das folgende: aaaaaaaa???????? 1. >>8 00000000aaaaaaaa 2. & 0000000000000001 000000000000000a 3. (unsigned char) 0000000a Amateur schrieb: > Übliche Compiler machen das folgende: > aaaaaaaa???????? > 1. >>8 00000000aaaaaaaa > 2. & 0000000000000001 000000000000000a > 3. (unsigned char) 0000000a Wenn man hexadezimale Darstellung gewöhnt ist, kann man das überhaupt nicht vernünftig lesen. Bitte nicht a..f für ein einzelnes Bit verwenden, ich bekomme davon Kopfschmerzen... ;-) Amateur schrieb: > ...wenn adr wenigstens 16 Bit hat. > Andernfalls ist das Ergebnis vorhersehbar 0. Ach?
@ Mikro 76,9 Der TO nannte die Ausgangsvariable "adr". Dumm wie ich nun mal bin, habe ich eine Zahl ohne Vorzeichen vorausgesetzt... Im Übrigen funktioniert Dein Bleistift nur bei Zahlen oberhalb 127. Amateur schrieb: > Im Übrigen funktioniert Dein Bleistift nur bei Zahlen oberhalb 127. Es gibt kein int8_t > 127. Wenn der Wert <= 127 und >= 0 kommt halt 0 raus. Wenn der Wert >=-128 und < 0 kommt 1 raus. @Nico
>Im Übrigen funktioniert Dein Bleistift nur bei Zahlen oberhalb 127.
Interessanterweise hat Mikro seinen signed char mit 0xff gefüttert.
Schon mit 0x7e sieht das Ganze anders aus.
Amateur schrieb: > @Nico >>Im Übrigen funktioniert Dein Bleistift nur bei Zahlen oberhalb 127. > Interessanterweise hat Mikro seinen signed char mit 0xff gefüttert. Ja, aber 0xff ist bei signed char -128 und nicht 255 :) Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.
|
|