Я читал знаменитую книгу «Компьютерные системы: взгляд программиста» и заблудился в умножении на константы. В книге говорится:
целочисленное умножение намного дороже, чем сдвиг и сложение, многие компиляторы C пытаются удалить множество случаев, когда целое число умножается на константу с комбинациями сдвига, сложения и вычитания. Например, предположим, что программа содержит выражение x * 14. Понимая, что 14 можно записать как 1101, компилятор может переписать умножение как (x<<3) + (x<<2) + (x<<1)
. И мы можем вычислить влияние этих битов на продукт, используя любую из двух разных форм:
, а также говорится, что мы можем изменить выражение для формы B для случая, когда позиция бита n является наиболее значимым битом как:
-(x<<m)
, поскольку в форме B указано, что мы должны вычислить (x<<w) - (x<<m)
, но сдвиг x влево на w даст значение 0.
Я так запуталась, что это на самом деле значит? Допустим, мы хотим умножить x на 12 (1100), так как старший бит равен 1, тогда его можно упростить как - (x<<2)
, где m в данном случае равно 2, но как это возможно? если x - беззнаковое число, то мы умножаем его на 12, как тогда мы можем получить отрицательное число?