Bitwise-Operatoren und signierte Typen

Ich lese C ++ Primer und bin ein wenig verwirrt von ein paar Kommentaren darüber, wie Bitwise-Operatoren mit signierten Typen umgehen. Ich zitiere:

Quote # 1

(Wenn es sich um bitweise Operatoren handelt) "Wenn der Operand signiert ist und sein Wert negativ ist, ist die Art und Weise, wie das" Vorzeichenbit "in einer Reihe von bitweisen Operationen behandelt wird, maschinenabhängig. Außerdem wird eine sich ändernde Linksverschiebung durchgeführt der Wert des Vorzeichenbits ist undefiniert "

Zitat # 2

(Wenn es sich um den Rightshift-Operator handelt) "Wenn dieser Operand nicht vorzeichenbehaftet ist, fügt der Operator links 0-wertige Bits ein. Wenn es sich um einen vorzeichenbehafteten Typ handelt, ist das Ergebnis implementierungsdefiniert - entweder Kopien des Vorzeichen-Bits oder 0- Wertbits werden links eingefügt. "

Die bitweisen Operatoren befördern kleine Ganzzahlen (z. B. char) in signierte Ints. Gibt es kein Problem mit dieser Promotion zuunterzeichne ints, wenn bitweise Operatoren bei signierten Operatortypen häufig undefiniertes oder implementierungsdefiniertes Verhalten liefern? Warum sollte der Standard char nicht auf unsigned int hochstufen?

Bearbeiten Hier ist die Frage, die ich herausgenommen habe, aber ich habe sie für den Kontext mit einigen Antworten unten zurückgestellt.

Eine Übung fragt später

"Was ist der Wert von~'q' << 6 auf einer Maschine mit 32-Bitints und 8 bitchars, das den Zeichensatz Latin-1 verwendet, in dem 'q' das Bitmuster @ h01110001? "

Nun, 'q' ist ein Zeichenliteral und wird zu int befördert, was @ ergib

~'q' == ~0000000 00000000 00000000 01110001 == 11111111 11111111 11111111 10001110

Der nächste Schritt ist das Anwenden eines Linksschiebeoperators auf die obigen Bits, aber alsquote # 1 Erwähnungen

"Eine Linksverschiebung durchzuführen, die den Wert des Vorzeichenbits ändert, ist undefiniert"

Na, ich weiß nicht genau, welches Bit das Vorzeichenbit ist, aber die Antwort ist sicherlich undefiniert?

Antworten auf die Frage(6)

Ihre Antwort auf die Frage