C11 §6.5.7 Paragraf 5:Czy "-1 >> 5;" nieokreślone zachowanie w C?
Wynik
E1 >> E2
jestE1
prawo przesuniętyE2
pozycje bitów. JeśliE1
ma niepodpisany typ lub jeśliE1
ma podpisany typ i nieujemną wartość , wartość wyniku stanowi integralną część wartości zE1/2*^E2
. Jeśli wartośćE1
ma wartość typu podpisanego i ujemną: , wynikowa wartość jest definiowana przez implementację.
Ale Dokument viva64 referencyjna mówi:
int B; B = -1 >> 5; // unspecified behavior
Pobiegłem ten kod na GCC i to zawsze daje wyjście -1
.
więc powiedzieć, że norma „Jeśli E1 ma podpisaną rodzaj i wartość ujemną, wartość wynikowa jest realizacja zdefiniowanej”, ale to dokument powiedzieć, że -1>>5;
jest nieokreślone zachowanie.
Więc, czy -1>>5;
nieokreślone zachowanie w C? Który jest poprawny?
Jeśli próbujesz napisać kod przenośny, rozróżnienie między definicją implementacji a nieokreśloną nie jest bardzo znaczące, więc kontrolerzy kodu traktują je w podobny sposób. – Barmar
Jest zdefiniowany przez implementację. – chux
@chux Więc ten dokument jest niepoprawny ?? – rsp