Как мне выполнить подписанный сдвиг вправо (>>) в c? - PullRequest
0 голосов
/ 31 января 2019

как мне выполнить подписанный сдвиг вправо в c?как -25 >> 3.

Я пытался так: 10011001 >> 3 == 00010011

Но результат -4.

Ответы [ 3 ]

0 голосов
/ 31 января 2019

Согласно стандарту 6.5.7p5

Результатом E1 >> E2 является E1-сдвинутая вправо позиция бита E2.Если E1 имеет тип без знака или если E1 имеет тип со знаком и неотрицательное значение, значение результата является неотъемлемой частью отношения E1 / 2 E2 .Если E1 имеет тип со знаком и отрицательное значение, результирующее значение определяется реализацией.

Результат определяется реализацией, и вы должны посмотреть, как он там определен.

Если допустить, что два дополнения и подписанное смещение вправо, -25 равно 11100111, смещение на 3 приведет к 11111100, что составляет -4.

0 голосов
/ 31 января 2019

Поскольку правильное смещение целого числа со знаком является реализацией, определенной из моего опыта, результат зависит от наличия арифметического смещения на целевой машине.Потому что в настоящее время довольно трудно найти какие-либо компьютеры или компьютеры без них, почти всегда это результат арифметического сдвига вправо

Из Википедии: enter image description here

0 голосов
/ 31 января 2019

То, что - это сдвиг вправо со знаком.При сдвиге со знаком отрицательное число (обозначаемое «1» в старшем бите) часто заполняется слева.(Хотя это зависит от конкретного компилятора. Похоже, именно это и делает ваш компилятор.) 11100111 -> 11110011 -> 11111001 -> 11111100

Похоже, вы ищетебеззнаковый сдвиг.Если вы используете (signed char)(((unsigned char)-25)>>3), вы, вероятно, получите результаты, которые вы ищете.

...