Ich lerne von meinem Lehrer, dass & gt; & gt; 1 die Zahl durch zwei teilt. Es funktioniert bei positiver Zahl, funktioniert aber nicht bei negativen Zahlen. Kann mir jemand das erklären?
Danke
Als BЈoviћ & amp; mystische Zustände, die Bit-Shift-Operatoren für negative Zahlen verwenden, ist die Implementierung definiert.
Der Grund dafür ist, dass C nicht zwischen logischer und arithmetischer Bitverschiebung unterscheidet
(Arithmetische Pads mit dem höchstwertigen Bit, logische Pads mit Nullen)
für positive Zahlen ist dies egal, denn sowohl die arithmetischen als auch die logischen Bitverschiebungen würden das höchstwertige Bit als 0 behalten:
Arithmetik 5 & gt; & gt; 1
0000 0000 0000 0101
= 5
zu
0000 0000 0000 0010
= 2
Logisch 5 & gt; & gt; 1
0000 0000 0000 0101
= 5
zu
0000 0000 0000 0010
= 2
jedoch mit einer negativen Zahl (2's comp)
Arithmetik -5 & gt; & gt; 1
1111 1111 1111 1011
= -5
zu
1111 1111 1111 1101
= -3
Logisch -5 & gt; & gt; 1
% co-de% = -5
zu
1111 1111 1111 1011
= 32.765
oder zumindest, das ist, wie ich es verstehe
Es funktioniert auf positive Zahl, aber es funktioniert nicht auf negative Zahlen.
Bei Verwendung von Shift-Operatoren für negative Ganzzahlen wird die Implementierung definiert.
[expr.shift] / 3 sagt folgendes:
Der Wert von E1 & gt; & gt; E2 ist E1 nach rechts verschobene E2-Bitpositionen. Wenn E1 einen vorzeichenlosen Typ hat oder wenn E1 einen vorzeichenbehafteten Typ und einen nicht negativen Wert hat, ist der Wert des Ergebnisses der ganzzahlige Teil des Quotienten von E1 / 2E2. Wenn E1 einen Typ mit Vorzeichen und einen negativen Wert hat, ist der resultierende Wert implementierungsdefiniert.
Vor allem,
5 binär ist 0000 0000 0000 0101
aber was ist mit -5? Hier ist es:
Jetzt erhalten wir: -5 = 1111 1111 1111 1011 (es ist in Zweierkomplementform)
So, hier ist, wie man -5 & lt; & gt; 1:
Ich lerne von meinem Lehrer, dass & gt; & gt; 1 die Zahl durch zwei teilt.
Es teilt nicht die ganze Zahl durch zwei, aber es führt aus (abhängig vom Wert) eine logische oder eine arithmetische Verschiebung um ein Bit nach rechts. Es ist unter Umständen gleichzusetzen mit einer Zweiteilung.
Es funktioniert auf positive Zahl, aber es funktioniert nicht bei negativen Zahlen.
Es funktioniert in beiden Fällen, aber das genaue Verhalten wird nicht vom Standard vorgeschrieben, sondern ist implementationsdefiniert. Es teilt sich normalerweise durch zwei und schneidet das Ergebnis gegen die negative Unendlichkeit ab, im Gegensatz zu Null, wie es eine normale Division tun würde.
Als Referenz:
Ich denke, die Antwort ist richtig. Als '/' (Division) -Operator erzeugen Sie den Quotienten (Ergebnis der Division).
Das ist also sowohl mit der positiven als auch mit der negativen Zahl in Ordnung.
Es ist also gut mit positiver Nummer.
Bleib niemals eine negative Zahl. Es ist immer positive Zahl.
Ich denke die Antwort auf -5 & gt; & gt; 1 = -3. Im Falle einer positiven Zahl, beispielsweise 5, ergibt die Division durch 2 eine Abrundung von 2,5 auf die nächste kleinste ganze Zahl, d. H. 2
Aber wenn wir eine negative Zahl, -5, betrachten, ergibt die Division durch 2 -2.5. Seine Abrundung auf die nächste ganze Zahl ergibt -3.
In c behält der Operator der rechten Verschiebung das Vorzeichenbit bei. Wenn die Bits nach rechts verschoben werden und das Vorzeichenbit erhalten bleibt, ergibt sich wieder eine negative Zahl, die in zwei Komplementärform vorliegt.
Tags und Links c++ bitwise-operators