> "bit" paßt in einen 32-Bit-Integer, wird also in einen solchen konvertiert.
Nein. Integer-Arithmetik findet immer in mindesten int-Größe statt (wie
groß auch immer das ist). bit (ein uint16_t) ist auf ARM kleiner als
int (32 Bit), also wird es zu int erweitert. Auf Systemen mit
16-Bit-Ints bliebe es ein uint16_t.
> 16U passt nicht hinein und bleibt deshalb ein unsigned int.
Ist egal, ist ein (unsigned) int, bleibt auch einer. Btw, das U ist
unnötig.
> Um die Schiebeoperation durchführen zu können, wird anschließend "bit" vom
> Int -in das es vorher konvertiert wurde- in ein unsigned Int konvertiert
Nein, der int-Wert wird 16-mal nach links geschoben, Resultat ist wieder
ein int. Vorsicht bei 16-Bit-Int-Systemen!
> - hier tritt der mögliche Datenverlust auf und der GCC warnt mich.
Nein, die Warnung kommt bei der Zuweisung eines (signed) int an ein
uint32_t.
> Mit der Änderung
1 | GPIOx->BSRR = (uint32_t) bit<<16U;
|
> wird "bit" direkt passend kovertiert und der Zwischenschritt über einen
> signed integer bleibt aus. Habe ich das richtig verstanden?
Genau. Und nur so auf Systemen mit 16-Bit-Ints korrekt.
Btw, der cast bezieht sich auf bit, nicht auf das Ergebnis des Shifts.
Ich würde die Leerstellen deshalb anders setzen:
1 | GPIOx->BSRR = (uint32_t)bit << 16;
|