Rolf M. schrieb:
> Wilhelm M. schrieb:
>> und beispielhaft
>> DraconixClass::ConvBytes DraconixClass::From16Bit(const uint16_t vari) {
>> return {vari & 0xff, (vari >> 8) & 0xff}; // Aggregat-Initialisierung
>> }
>
> Da fehlt ein const.
Das stimmt (ich hatte leider auf eine Compilation verzichtet).
>
> Klaus schrieb:
>> Rene K. schrieb:
>>> (HVari << 8)
>>
>> war da nicht was wie
>> "shift-operationen von signed typen -> implementation-defined?"
>
> Nicht ganz. Bei einem a << b mit vorzeichenbehafteten a ist alles ok,
> wenn a positiv ist und das Ergebnis von 2 hoch b in den Zieltyp passt.
> Wenn nicht, ist es allerdings nicht nur implementation-defined sondern
> undefined behavior. Was allerdings implementation-defined ist, ist ob
> char signed ist oder nicht. Zu beachten ist noch die integer-promotion,
> die HVari erst mal auf int erweitert, bevor geshiftet wird.
Deswegen hatte ich die Signatur der Funktionen auch gleich angepasst.
> Insgesamt heißt das, dass es tatsächlich in zwei Fällen zu undefiniertem
> Verhalten kommen kann, nämlich wenn HVari negativ ist (auf Compilern mit
> vorzeichenbehaftetem char) oder wenn das Ergebnis des Shifts nicht mehr
> in int passt (bei einem Compiler mit vorzeichenlosem char und einem 16
> Bit breiten int, wenn HVari > 127 ist).
Ab C++20 gibt es nur noch einen Fall von UB, nämlich wenn der rechte
Operand größer ist als die Bitbreite des linken Operanden (nach ggf.
Promotion) oder negativ ist.