Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

[C++] Działanie operatora >> na liczbach ujemnych

Ostatnio zmodyfikowano 2013-01-17 15:09
Autor Wiadomość
DejaVu
Temat założony przez niniejszego użytkownika
[C++] Działanie operatora >> na liczbach ujemnych
» 2013-01-17 11:05:09
C/C++
#include <cstdio>

int main()
{
    printf( "int      | %10d | 0x%X\n", - 5, - 5 );
    printf( "int      | %10d | 0x%X\n",( - 5 ) >> 1,( - 5 ) >> 1 );
    printf( "unsigned | %10d | 0x%X\n", static_cast < unsigned >( - 5 ) >> 1, static_cast < unsigned >( - 5 ) >> 1 );
    return 0;
}
Standardowe wyjście programu:
int      |         -5 | 0xFFFFFFFB
int      |         -3 | 0xFFFFFFFD
unsigned | 2147483645 | 0x7FFFFFFD
Jak widać w przypadku liczb ujemnych operator >> działa nieco inaczej aniżeli byśmy się tego spodziewali :)
P-74177
Elaine
» 2013-01-17 13:05:39
Działa w dokładnie taki sposób, jakiego można się spodziewać, arithmetic shift przecież jest dosyć oczywistym i bardzo przydatnym zachowaniem, gdy liczby mogą być ujemne. I nie tylko, często przydaje się również w sytuacjach, gdy liczby są nieujemne ale górny bit coś znaczy.

Przynajmniej pod większością kompilatorów, według standardu zachowanie w tej sytuacji jest zdefiniowane przez implementację, nie musi to być arithmetic shift.
P-74186
DejaVu
Temat założony przez niniejszego użytkownika
» 2013-01-17 13:57:23
No tak... tyle, że jakoś nigdy do tej pory nie operowałem na liczbach ujemnych, a w Javie jest operator >>>, który zawsze zachowuje się tak, jakby liczba była typu unsigned :) Myślałem, że jest to po prostu instrukcja asmowa SHR, a tu się okazuje, że do intów używany jest SAR (którego nie znałem i teraz wygooglałem :P).

http://rudy.mif.pg.gda.pl/~bogdro/dos/a_kurs13.htm
P-74193
Elaine
» 2013-01-17 14:45:54
w Javie jest operator >>>, który zawsze zachowuje się tak, jakby liczba była typu unsigned
Bo Java jest upośledzona i musieli zrobić jakąś protezę wobec braku unsigned.
Myślałem, że jest to po prostu instrukcja asmowa SHR, a tu się okazuje, że do intów używany jest SAR
Tylko na x86, na większości innych architektur te instrukcje mają inne nazwy. Chyba że chodzi o ARM, gdzie w ogóle nie ma instrukcji do przesunięć bitowych (Thumb się nie liczy).
P-74200
DejaVu
Temat założony przez niniejszego użytkownika
» 2013-01-17 15:09:17
No dobra, to temat zamykam :) Dzięki za dodatkową wzmiankę dot. Javy, że 'jest upośledzona' :P No ale znać ją wypada :)
P-74208
« 1 »
  Strona 1 z 1