Bit-Shifting Verständnisproblem

OP #3805731
Lesenswert?
• ▲
▼
Hallo,
eine kurze Frage zu einem Bit-Shift:
1
uint32_t FirmwareByteAnzahl;
2
FirmwareByteAnzahl = (uint8_t)0x80;
3
FirmwareByteAnzahl |= ((uint8_t)0x80 << 8) & 0xFF00;
4
FirmwareByteAnzahl |= ((uint8_t)0 << 16) & 0xFF0000;

Ohne die UND Operatoren kommt:
1
11111111 11111111 10000000 10000000
heraus. Wieso sind die letzten beiden Bytes 0xFF ?
OP #3805747
Lesenswert?
• ▲
▼
Karl M. schrieb:
> Diese Zeile mach schon mal gar nichts!
> FirmwareByteAnzahl |= ((uint8_t)0 << 16) & 0xFF0000;

Ja Imgrunde stammt der Code aus einer Routine. Die Null kann dort ein 
weiteres Byte sein.

Trotzdem ist es mir nocht nicht klarer geworden.

Wenn ich 0x80 in die Variable lade kommt das raus:
1
00000000 00000000 00000000 10000000
Wenn ich das Byte 0x80 Shifte und mit Oder reinkopple, müsste doch 
eigentlich folgendes herauskommen:
1
00000000 00000000 10000000 10000000
#3805765
Lesenswert?
• ▲
▼
Manuel H. schrieb:
> Trotzdem ist es mir nocht nicht klarer geworden.
>
> Wenn ich 0x80 in die Variable lade kommt das raus:
> 00000000 00000000 00000000 10000000
> Wenn ich das Byte 0x80 Shifte und mit Oder reinkopple,
> müsste doch eigentlich folgendes herauskommen:
> 00000000 00000000 10000000 10000000

Nur wenn int bei dir 32 Bit breit ist. Bei einem 16-Bit-int kommt 
erstmal raus:
10000000 10000000
Zur Erweiterung auf den uint32_t auf der linken Seite wird nun erstmal 
der int vorzeichenrichtig auf 32 Bit erweitert, was im Prinzip bedeutet, 
daß das oberste Bit des int in die nächsten 16 Bit reinkopiert wird. 
Danach wird dieses Bitpattern dann in einen uint32_t geschrieben.
#3805767
Lesenswert?
• ▲
▼
Und bei der Version mit "& 0xFF00" wirds noch etwas subtiler. Denn 
0xFF00 ist vom Typ "unsigned". Das ändert zwar zunächst nichts am 
Bitpattern des Ergebnisses, aber an dessen Typ. Der ist nun auch vom Typ 
"unsigned". Und der wird bei der Zuweisung ohne Vorzeichen auf 32 Bits 
erweitert.
OP #3805795
Lesenswert?
• ▲
▼
Habe leider noch keine defekte Platine erwischt, an der ich endlich 
testen kann. Sobald ich eine in den Händen halte, werde ich die neue 
Firmware testen. Teile es dann natürlich im anderen Thread ;)

@ A.K. die Null Version kommt in meinem Code gar nicht vor, ist nur beim 
Posten entstanden.

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.