Mail.ruПочтаМой МирОдноклассникиВКонтактеИгрыЗнакомстваНовостиКалендарьОблакоЗаметкиВсе проекты

Существует ли разница между командами логического и арифметического сдвигов, для языка Ассемблер?

БрокенЭнжел Знаток (312), закрыт 16 лет назад
Лучший ответ
H H Ученик (137) 16 лет назад
Инструкция SHR (логический сдвиг вправо) выполняет сдвиг разрядов опе-
ранда вправо на 1 или CL бит, затем сдвигает наименее значащий
бит во флаг переноса и помещает 0 в самый значащий бит.
Инструкция SAR (арифметический сдвиг вправо) аналогична
инструкции SHR, только при ее выполнении наиболее значащий бит
операнда сдвигается вправо в следующий бит, а затем копируется
обратно.
БрокенЭнжелЗнаток (312) 16 лет назад
Т.е. при логическом сдвиге "опустевший" бит по-любому заполняется 0,
а в случае арифметического сдвига заполняется по предыдущему значению "опустевшего" бита?

или проще:

двигая 1111,1111 лог вправо: 0111,1111
двигая 1111,1111 ариф вправо: 1111,1111
так?
Alexandr ЫыхПросветленный (23527) 16 лет назад
Если рассматривать 1011 1111 (двоичное) как беззнаковое,
то это 191 (десятичное)
191
Лог_Сдвиг_Вправо (1011 1111) = 0101 1111 (и 1 во флаге переноса)
0101 1111 (двоич) = 95 + 1/2
то есть применив логический сдвиг вправо мы разделили БЕЗЗНАКОВОЕ число на 2 и во флаге переноса получили остаток.
__________
А если рассматривать 1011 1111(двоичное) КАК ЗНАКОВОЕ,
то это -65(десятичное)
Арифм_Сдвиг_Вправо (1011 1111) = 1101 1111 (и 1 во флаге переноса)
1101 1111 (двоичное) = -33 + 1/2
То естьприменив арифметический сдвиг вправо мы разделили ЗНАКОВОЕ число на 2 и во флаге переноса получили остаток.
ru.wikipedia.org/wiki/Побитовый_сдвиг

То есть если рассматривать число как знаковое, то содержимое старшего бита определяет знак 1=отрицательное, 0=положительное и при арифметическом сдвиге знак сохраняется.
Остальные ответы
Похожие вопросы