Я понимаю, что есть похожие вопросы. Но мне любопытно, почему логический сдвиг влево совпадает с арифметическим сдвигом влево.
Я понимаю, что арифметический и логический сдвиг влево технически одинаковы, так как старший бит (старший бит) не сохраняется в обеих операциях, а старший бит заменяется на 0, а все биты просто сдвигаются влево. Но почему мы не можем сохранить старший бит, сдвигая остальные биты, оставленные для арифметического сдвига влево? Арифметический сдвиг вправо сохраняет старший бит для обозначения бита со знаком, так почему же мы не делаем то же самое для арифметического сдвига влево?
Например, в Java: ››› — логический сдвиг вправо, а ›› — арифметический сдвиг вправо, но ‹‹ выполняет как арифметический, так и логический сдвиг влево, даже если знаковый бит не сохраняется.
int x
ниx*2
иx+x
сохраняют знаковый бит, так почему эквивалентная операцияx<<1
должна сохранять его? - person Thomas Kläger   schedule 14.07.2021