Przesunięcie bitowe - problem

0

Witam,

mam pewien dziwny problem z przesunięciem bitowym w następującym kodzie:

	unsigned int t = 255;
	unsigned int p = 0;
	t = t & ( 0xffffffff >> (32 - 0) );

i wszystko jest ok, czyli t w wyniku jest równe 0. Natomiast problem pojawia się w momencie gdy (32 - 0) zastępuje na (32 - p), zmienna p jest jak widać 0. czyli linijka wygląda tak:

t = t & ( 0xffffffff >> (32 - p) ); 

i wynik jest równy t = 255. Nie mam pojęcia o co chodzi.. Macie jakiś pomysł?

OK problem rozwiązany, zmienna p musi być const.

0

problem był gdzie indziej. 0xffffffff ma typ int, stad problem. powinienes zapisac 0xffffffffUL

0

żeby było jaśniej skąd ten problem.
W pierwszym przypadku kompilator oblicza wartość całego wyrażenia w czasie kompilacji a następnie tę wartość traktuje jako liczbę całkowitą ze znakiem i masz wynik zgodny z oczekiwaniem.
W drugim wypadku kompilator przygotowuje zestaw obliczeń. W tych obliczeniach wartość 0xffffffff jest traktowana jako liczba całkowita ze znakiem, a ponieważ zapełniasz tą wartością też bit znaku to tak naprawdę reprezentuje on liczbę -1. Przesunięcia bitowe w prawo liczby ze znakiem powoduje zachowanie bitu znaku, wiec każde przesuniecie o 1 liczby -1 daje cały czas liczbę -1. Czyli bez względu na wartość p w wyniku końcowym otrzymasz niezmienione t.
Czyli poprzednik podał prawidłowe rozwiązanie.

0

C++ Standard - ANSI ISO IEC 14882 2003

5.8 Shift operators
...
The behavior is undefined if the right operand is negative, or greater than or equal to the length in bits of the promoted left operand.
...

1 użytkowników online, w tym zalogowanych: 0, gości: 1