[C++] Działanie operatora >> na liczbach ujemnych
Ostatnio zmodyfikowano 2013-01-17 15:09
DejaVu Temat założony przez niniejszego użytkownika |
[C++] Działanie operatora >> na liczbach ujemnych » 2013-01-17 11:05:09 #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 :) |
|
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. |
|
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 |
|
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). |
|
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 :) |
|
« 1 » |