Je n'ai pas tout de le présenter leurs réponses. La norme dit clairement que le droit-la vitesse d'un nombre négatif est la mise en œuvre définies par le comportement. C'est pas un comportement non spécifié, ce qui signifie quelque chose d'autre. Comme vous l'avez bien citer (C17 6.5.7 §5):
Le résultat de E1 >> E2 E1 décalés vers la droite E2 positions de bits. /--/
Si E1 a signé un type et une valeur négative, la valeur résultante de la mise en œuvre est définie.
Cela signifie que le compilateur doit documenter la façon dont il se comporte. Période.
En pratique: le document doit dire si le compilateur utilise l'arithmétique décalage à droite ou logique décalage à droite.
C'est par opposition à un comportement non spécifié, qui est spécifique à l'implémentation comportement qui n'a pas besoin d'être documenté. Un comportement non spécifié est utilisé dans deux cas:
- Lorsque le comportement du compilateur pourrait être une mise en œuvre un secret que le fournisseur de compilateur ne devraient pas être contraints de révéler à leurs concurrents.
- Lorsque le compilateur ne peut pas être pris la peine de documenter la façon dont les détails sous-jacents tels que les OS et la mémoire RAM de cellules de mémoire de travail.
Par exemple, un compilateur n'a pas besoin de document de l'ordre de l'évaluation dans le code comme ceci:
a = f1() + f2();
a += f1() + f2();
Documenter l'ordre dans lequel les sous-expressions sont évaluées permettrait de révéler des détails sur la façon dont le compilateur interne de l'arborescence d'expression et l'optimiseur de travail qui permettraient de révéler pourquoi un compilateur génère un code de meilleure qualité ou compile plus rapide que la concurrence. Ce fut une grande chose lorsque la norme a été écrit à l'origine. Moins le cas aujourd'hui, quand il y a certains grands open-source de compilateurs, de sorte qu'il n'est plus un secret.
De même, un compilateur n'a pas besoin de documenter ce que ce code imprime:
int a;
int ptr = &a;
printf("%d", *ptr);
a
est une période indéterminée, la valeur et la sortie est non spécifié - dans la pratique, la production dépend de ce qui était stocké en particulier la RAM de la cellule avant. Ce que nous appelons un "la valeur d'ordures". (Avant de crier "UB", voir (Pourquoi) est d'utiliser une variable non initialisée comportement indéfini?).