Linke Verschiebung negativer Werte um 0 Positionen?

8

In C ist eine Verschiebung eines negativen Wertes nach links ein undefiniertes Verhalten. Ich habe zwei Bibliotheken gefunden, die mit ICC von Intel kompiliert wurden, wobei der fehlerhafte Code entfernt wurde. Derselbe Code war unter Clang, Comeau, GCC und MSVC in Ordnung.

Bezeichnet der Standard eine Verschiebung um einen negativen Wert von 0 Stellen? Ist es auch undefiniert?

(Das Detail, auf das ich neugierig bin, ist eine 0-dimensionale Schicht, die in der Praxis keine Verschiebung ist. Ich frage mich also, ob die Sprache so vage ist, dass eine Verschiebung um 0 möglich ist).

    
jww 05.04.2014, 16:48
quelle

1 Antwort

7
___ tag123bitshift ___ Eine Bit-Shift-Operation verschiebt die in einer Binärzahl oder einem Bitmuster enthaltenen Bits nach links oder rechts. ___ tag123c ___ C ist eine universelle Computerprogrammiersprache, die für Betriebssysteme, Bibliotheken, Spiele und andere Hochleistungsanwendungen verwendet wird. Dieses Tag sollte bei allgemeinen Fragen zur C-Sprache verwendet werden, wie in der Norm ISO 9899: 2011 definiert. Fügen Sie ggf. ein versionsspezifisches Tag wie c99 oder c90 für Fragen zu älteren Sprachstandards hinzu. C unterscheidet sich von C ++ und es sollte nicht mit dem C ++ - Tag kombiniert werden, wenn ein rationaler Grund fehlt. ___ qstntxt ___

In C ist eine Verschiebung eines negativen Wertes nach links ein undefiniertes Verhalten. Ich habe zwei Bibliotheken gefunden, die mit ICC von Intel kompiliert wurden, wobei der fehlerhafte Code entfernt wurde. Derselbe Code war unter Clang, Comeau, GCC und MSVC in Ordnung.

Bezeichnet der Standard eine Verschiebung um einen negativen Wert von 0 Stellen? Ist es auch undefiniert?

(Das Detail, auf das ich neugierig bin, ist eine 0-dimensionale Schicht, die in der Praxis keine Verschiebung ist. Ich frage mich also, ob die Sprache so vage ist, dass eine Verschiebung um 0 möglich ist).

    
___ qstnhdr ___ Linke Verschiebung negativer Werte um 0 Positionen? ___ antwort22883850 ___

Auszug aus C99 mit den technischen Berichtigungen TC1, TC2 und TC3 :

  

6.5.7 Bitweises Shift-Operatoren

[...]

  

Die Integer-Promotions werden für jeden der Operanden ausgeführt. Der Typ des Ergebnisses ist   das des beförderten linken Operanden. Wenn der Wert des rechten Operanden negativ ist oder ist   größer oder gleich der Breite des heraufgestuften linken Operanden ist das Verhalten nicht definiert.
  Das Ergebnis von E1 & lt; & lt; E2 ist E1 nach links verschobene E2-Bitpositionen; frei gewordene Bits sind mit gefüllt   Nullen. Wenn E1 einen vorzeichenlosen Typ hat, ist der Wert des Ergebnisses E1 × 2 , reduzierter Modulo   ein mehr als der Maximalwert, der im Ergebnistyp dargestellt werden kann. Wenn E1 signiert ist   Typ und nichtnegativer Wert, und E1 × 2 ist im Ergebnistyp darstellbar, dann ist das   der resultierende Wert; Andernfalls ist das Verhalten nicht definiert.

Also immer undefiniert.

    
___
Deduplicator 05.04.2014, 16:53
quelle

Tags und Links