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

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren