Arithmetisch Shift Rechts Binär Optionen
Beim Verschieben nach links gibt es keinen Unterschied zwischen arithmetischer und logischer Verschiebung. Beim Rechtsschieben hängt die Art der Verschiebung vom Typ des zu verschiebenden Wertes ab. (Als Hintergrund für jene Leser, die mit dem Unterschied nicht vertraut sind, verschiebt eine logische Rechtsverschiebung um 1 Bit alle Bits nach rechts und füllt das linkste Bit mit einer 0. Eine arithmetische Verschiebung verlässt den ursprünglichen Wert in dem linken Bit Wichtig beim Umgang mit negativen Zahlen.) Beim Verschieben eines vorzeichenlosen Wertes ist der Operator in C eine logische Verschiebung. Beim Verschieben eines signierten Wertes ist der Operator eine arithmetische Verschiebung. Zum Beispiel, unter der Annahme einer 32-Bit-Maschine: beantwortet Aug 11 08 um 9:16 So schließen, Greg. Ihre Erklärung ist nahezu perfekt, aber Verschieben eines Ausdrucks von signierten Typ und negativen Wert ist implementiert-definiert. Siehe ISO IEC 9899: 1999 Abschnitt 6.5.7. Ndash Rob 22:22 Rob: Eigentlich, für Linkshänder und unterschriebene negative Zahl, ist das Verhalten undefiniert. Ndash JeremyP Apr 4 12 at 15:24 Tatsächlich führt die linke Verschiebung auch zu einem nicht definierten Verhalten für positiv signierte Werte, wenn der resultierende mathematische Wert (der in der Bitgröße nicht begrenzt ist) als positiver Wert in diesem signierten Typ dargestellt werden kann. Die Quintessenz ist, dass Sie sorgfältig vorgehen müssen, wenn Sie rechts einen signierten Wert verschieben. Ndash Michael Burr Jun 21 13 um 0:30 Der erste ist der Unterschied zwischen logischen und arithmetischen Verschiebungen aus einer mathematischen Sicht, ohne Sorgen über Datentyp Größe. Logische Verschiebungen füllen immer ausgelassene Bits mit Nullen, während die arithmetische Verschiebung sie mit Nullen nur für die linke Verschiebung füllt, aber für die rechte Verschiebung kopiert sie das MSB, wodurch das Vorzeichen des Operanden bewahrt wird (unter der Annahme einer Zweierkomplement-Codierung für negative Werte). Mit anderen Worten, die logische Verschiebung betrachtet den verschobenen Operanden nur als einen Strom von Bits und verschiebt sie, ohne sich um das Vorzeichen des resultierenden Werts zu kümmern. Arithmetische Verschiebung betrachtet es als eine (unterzeichnete) Zahl und bewahrt das Zeichen, wie Verschiebungen gebildet werden. Eine linke arithmetische Verschiebung einer Zahl X durch n entspricht der Multiplikation von X mit 2 n und ist somit gleichbedeutend mit der logischen Linksverschiebung eine logische Verschiebung würde auch das gleiche Ergebnis ergeben, da MSB sowieso vom Ende abfällt und theres nichts zu bewahren hat. Eine rechte Arithmetikverschiebung einer Zahl X durch n ist äquivalent zu der ganzzahligen Division von X durch 2 n NUR, wenn X nichtnegativ ist. Integer-Division ist nichts anderes als mathematische Teilung und runde gegen 0 (trunc). Bei negativen Zahlen, die durch die Zwei-Komplement-Kodierung dargestellt werden, hat die Verschiebung nach rechts um n Bits den Effekt, sie mit 2 n mathematisch zu dividieren und auf (Boden) zu runden, so daß die Rechtsverschiebung für nichtnegative und negative Werte unterschiedlich ist. Für X & sub0 ;, Xn X & sub2; n trunc (X²n) für Xlt & sub0 ;, Xn-Fußboden (X & sub2; n), wobei mathematische Division die ganzzahlige Division ist. Wir betrachten ein Beispiel: 37 2 18 (Abrundung 18,5 gegen 0) 10010) 2 Ergebnis der arithmetischen Rechtsverschiebung -37) 10 11011011) 2 (unter Berücksichtigung eines Zweierkomplements, 8-Bit-Darstellung) -37 2 -18 (Rundung 18,5 Richtung 0) 11101110) 2 NICHT das Ergebnis der arithmetischen Rechtsverschiebung -37 1 -19 (Rundung 18,5 nach) 11101101) 2 Ergebnis der arithmetischen Rechtsverschiebung Wie Guy Steele betonte. Diese Diskrepanz hat zu Bugs in mehr als einem Compiler geführt. Hier kann nicht-negativ (math) auf unsignierte und signierte nichtnegative Werte (C) abgebildet werden, beide werden gleich behandelt und rechtsverschoben wird durch Integer-Division durchgeführt. So logisch und arithmetisch sind bei linksverschobenen und für nichtnegativen Werten im rechten Verschieben seine in der rechten Verschiebung von negativen Werten, die sie unterscheiden, äquivalent. Operanden - und Ergebnistypen Standard C99 6.5.7: Jeder der Operanden muss Integer-Typen haben. Die Integer-Promotions werden auf jedem der Operanden ausgeführt. Der Typ des Ergebnisses ist der des geförderten linken Operanden. Wenn der Wert des rechten Operanden negativ ist oder größer oder gleich der Breite des geförderten linken Operanden ist, ist das Verhalten undefiniert. Im obigen Snippet werden beide Operanden int (aufgrund von Integer Promotion), wenn E2 negativ war oder E2 sizeof (int) CHARBIT dann ist die Operation undefined. Dies liegt daran, dass das Verschieben von mehr als die verfügbaren Bits sicher überlaufen wird. Had R wurde als kurz erklärt. Würde das int-Ergebnis der Verschiebeoperation implizit in eine kurze verengte Umwandlung umgewandelt werden, die zu implementierungsdefiniertem Verhalten führen kann, wenn der Wert nicht im Zieltyp darstellbar ist. Linke Verschiebung Das Ergebnis von E1 ltlt E2 ist E1 linksseitig verschobene E2-Bitpositionen, die frei gelassen werden, werden mit Nullen gefüllt. Wenn E1 einen unsignierten Typ hat, ist der Wert des Ergebnisses E12 E2. Reduzierte modulo eins mehr als der Maximalwert, der in der Ergebnistyp darstellbar ist. Wenn E1 einen signierten Typ und einen nicht-negativen Wert hat und E12 E2 im Ergebnistyp darstellbar ist, dann ist das der resultierende Wert andernfalls das Verhalten undefiniert. Da linke Verschiebungen für beide gleich sind, werden die freien Bits einfach mit Nullen gefüllt. Dann heißt es, daß für unsignierte und signierte Typen eine arithmetische Verschiebung vorliegt. Ich interpretiere es als arithmetische Verschiebung, da logische Verschiebungen sich nicht um den durch die Bits repräsentierten Wert kümmern, sondern schaut ihn nur als einen Bitsstrom an, aber der Standard spricht nicht in Form von Bits, sondern indem er ihn in Bezug auf den Wert, der erhalten wird, definiert Das Produkt von E1 mit 2 E2. Der Vorbehalt hierbei ist, dass bei signierten Typen der Wert nicht negativ sein sollte und der resultierende Wert im Ergebnistyp darstellbar sein sollte. Andernfalls ist die Operation undefiniert. Der Ergebnistyp wäre der Typ des E1 nach dem Integralförderung und nicht dem Ziel (die Variable, die das Ergebnis halten soll). Der resultierende Wert wird implizit in den Zieltyp konvertiert, wenn er in diesem Typ nicht repräsentativ ist, dann ist die Umsetzung implementierungsdefiniert (C99 6.3.1.3 3). Wenn E1 ein signierter Typ mit einem negativen Wert ist, dann ist das Verhalten der linken Verschiebung undefiniert. Dies ist ein einfacher Weg zu undefiniertem Verhalten, das leicht übersehen werden kann. Rechtsverschiebung Das Ergebnis von E1 E2 ist E1 rechtsverschobene E2-Bitpositionen. Wenn E1 einen unsignierten Typ hat oder wenn E1 einen signierten Typ und einen nicht-negativen Wert hat, ist der Wert des Ergebnisses der integrale Teil des Quotienten von E1 2 E2. Wenn E1 einen signierten Typ und einen negativen Wert hat, ist der resultierende Wert implementierungsdefiniert. Rechte Verschiebung für unsignierte und signierte nicht-negative Werte sind ziemlich gerade, die leeren Bits sind mit Nullen gefüllt. Für signierte negative Werte ist das Ergebnis der Rechtsverschiebung implementierungsdefiniert. Das heißt, die meisten Implementierungen wie GCC und Visual C implementieren rechts-Verschieben als arithmetische Verschiebung durch die Erhaltung der Zeichen-Bit. Fazit Im Gegensatz zu Java, das einen speziellen Operator gtgtgt für logische Verschiebung außer dem üblichen gtgt und ltlt hat. C und C haben nur arithmetische Verschiebung mit einigen Bereichen links undefiniert und Umsetzung definiert. Der Grund, warum ich sie für Arithmetik halte, liegt an der standardmäßigen Formulierung der Operation mathematisch, anstatt den verschobenen Operanden als einen Strom von Bits zu behandeln. Das ist vielleicht der Grund, warum es diese Bereiche nicht implementierungsdefiniert verlässt, anstatt nur alle Fälle als logische Verschiebungen zu definieren . Nun, ich sah es auf wikipedia. Und sie haben dies zu sagen: C, hat aber nur einen rechten Schichtoperator,. Viele C-Compiler entscheiden, welche Rechtsverschiebung durchgeführt werden soll, abhängig davon, welche Art von Integer verschoben wird, oft werden signierte Ganzzahlen mit der arithmetischen Verschiebung verschoben, und unsigned Integers werden mit der logischen Verschiebung verschoben. So klingt es wie es hängt von Ihrem Compiler. Auch in diesem Artikel, beachten Sie, dass linke Verschiebung ist die gleiche für arithmetische und logische. Ich würde empfehlen, einen einfachen Test mit einigen signierten und unsigned Zahlen am Rand Fall (High-Bit-Satz natürlich) und sehen, was das Ergebnis auf Ihrem Compiler ist. Ich würde auch empfehlen vermeiden, je nachdem, ob es die eine oder andere, da es scheint, C hat keinen Standard, zumindest wenn es vernünftig und möglich ist, eine solche Abhängigkeit zu vermeiden. Antwort # 2 am: August 11, 2008 at 9:18 Obwohl die meisten C-Compiler verwendet, um eine arithmetische Linksverschiebung für signierte Werte haben, scheint dieses hilfreiche Verhalten veraltet worden zu sein. Gegenwärtige Compilerphilosophie scheint, anzunehmen, daß die Leistung einer Linksverschiebung auf einer Variablen einen Compiler berechtigt, anzunehmen, daß die Variable nicht-negativ sein muß und folglich irgendeinen Code an anderer Stelle weglassen würde, der für korrektes Verhalten notwendig wäre, wenn die Variable negativ war . Ndash supercat Apr 16 15 am 5:47 Linke Verschiebung ltlt Das ist irgendwie einfach und wann immer du den Schichtoperator benutzt, ist es immer eine bitweise Operation, so dass wir es nicht mit einem Doppel - und Schwimmerbetrieb verwenden können. Sobald wir eine Null verschoben haben, wird sie immer dem niedrigstwertigen Bit (LSB) hinzugefügt. Aber in der Rechtsverschiebung müssen wir einer weiteren Regel folgen und diese Regel wird als Vorzeichen-Bit-Kopie bezeichnet. Bedeutung der Vorzeichenbitkopie ist, wenn das höchstwertige Bit (MSB) gesetzt ist, dann nach einer Rechtsverschiebung wieder das MSB gesetzt wird, wenn es zurückgesetzt wurde, wird es wieder zurückgesetzt, bedeutet, wenn der vorhergehende Wert Null war, dann nach dem Verschieben wieder die Bit Null ist, wenn das vorherige Bit eins war, dann ist es nach der Verschiebung wieder eins. Diese Regel gilt nicht für eine Linksverschiebung. Das wichtigste Beispiel für die Rechtsverschiebung, wenn Sie eine beliebige negative Zahl nach rechts verschieben, dann verschiebt sich nach einigen Verschiebungen der Wert schließlich auf Null und danach verschiebt sich diese -1 jede beliebige Anzahl von Malen, die der Wert gleich bleibt. Bitte prüfe. Ist das Ergebnis Muster die richtige Darstellung für -16 4 Nr. Das Ergebnis stellt eine große positive Zahl, nicht -4 Shift Right Arithmetic Eine rechts verschieben logische kann nicht verwendet werden, um eine negative Ganzzahl von zwei zu teilen. Das Problem besteht darin, daß ein logisches Verschiebungsrecht Nullen in das Bit hoher Ordnung bewegt. Dies ist in einigen Situationen wünschenswert, jedoch nicht zum Dividieren von negativen ganzen Zahlen, bei denen das Bit hoher Ordnung das Vorzeichenbit ist. Eine arithmetische Rechtsverschiebung repliziert das Vorzeichenbit nach Bedarf, um Bitpositionen zu füllen: FRAGE 13: Gibt es eine Notwendigkeit für eine arithmetische Verschiebung links Anweisung
Comments
Post a Comment