[C++] Сдвиг >> unsigned и signed

Olenenok

Столкнулся в MSVC 2005 со следующим:
Для signed int этот сдвиг сохраняет значение старшего бита (т.е., например, 0x80000000 >> 31 = 0xffffffff а вот для unsigned int 0x80000000 >> 31 = 1. Это стандарт?

Dasar

да, потому что если мы делим -4 на 4(сдвигаем на 2 то хотим получить -1, а не число в районе миллиарда.
тоже самое и наоборот.

okunek

при сдвиге вправо отрицательных чисел (есесно signed) - результат имплементэйшн дефайнед (с) стандарт

Olenenok

Вот это и хотел узнать. Столкнулся с этим при вычислении модуля целого числа по формуле
abs(x):=x-(x<<1)&(-(x>>31 - в MSVC пришлось делать x-x<<1)&(-(intunsigned)x>>31

Helga87

вопрос в сторону: чем стандартный abs(x) не устраивает?

okunek

я плакалъ

Olenenok

Устраивает, просто интересно было, вот и надумал формулку.

kruzer25

Тут максус какой-то такой же изврат спрашивал для процессоров, умеющих только сдвиги...

Andbar

Вообще-то на асме есть инструкции как для знакового сдвига, так и для беззнакового. Так что, наверное, можно написать unsigned int)variable) >> n, и не париться..
Либо, если кроссплатформенность не требуется, пиши на асме, юзай rol/ror/shl/shr

rosali

Мимо! rol ror это циклические сдвиги которые к теме отношения не имеют, они ставят на старшие позиции "исчезнувшие" младшие биты. Правильный ответ sar.

Andbar

а.. ну, да... Просто доки дельной нет под рукой (если не считать нечто под названием TeachHelp поэтому написал по памяти.

rosali

Я в Гугле нашел
Оставить комментарий
Имя или ник:
Комментарий: