Тип смещения влево - PullRequest
       43

Тип смещения влево

6 голосов
/ 16 февраля 2012

получить ошибку компилятора при попытке сделать

float_val=float_val<<1;

Выдает ошибку «ошибка C2296:« << »: недопустимый, левый операнд имеет тип« float ») </p>

Разве v не могут сдвигаться влево? Почему это так?

Ответы [ 7 ]

13 голосов
/ 16 февраля 2012

Вы не можете оставить переменные смещения float влево, потому что (a) ваш FPU, как правило, не имеет выставленного вам бочкообразного переключателя, поэтому физически не может сгенерировать код для этого, и (b) что бы это вообще значило? Базовое представление битов состоит из нескольких полей с разными значениями. Вы действительно хотите, чтобы эти биты сливались друг с другом?

Если вы хотите умножить число, хранящееся в этой переменной, на два, вы должны просто сделать это вместо этого.

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

4 голосов
/ 12 декабря 2016

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

https://linux.die.net/man/3/ldexpf

1 голос
/ 16 февраля 2012

Поскольку оператор левого сдвига определяется как умножение на степень 2, он имеет смысл для типов с плавающей запятой.Тем не менее, язык Си не определяет его использование, поэтому вместо этого вы должны использовать функцию scalbn или аналогичную.

1 голос
/ 16 февраля 2012

Сдвиг поплавков не имеет смысла, поскольку он представлен как конкатенация знакового бита, экспоненты и мантиссы.Поскольку операция сдвига связана со сдвигом битов, это будет означать сдвиг битов от мантиссы к показателю степени и / или к знаку бит.

1 голос
/ 16 февраля 2012

Числа с плавающей запятой не имеют битов на уровне представления значений, поэтому вы не можете применять к ним побитовые операции.

См. этот ответ для получения дополнительной информации.

0 голосов
/ 16 февраля 2012

Нельзя оставлять объекты сдвига типа float.

C говорит, что операнды операторов побитового сдвига должны иметь целочисленный тип.

0 голосов
/ 16 февраля 2012

Вы должны сначала преобразовать поплавок во что-то другое. Такие как:

float f = 128;
f = (float) (((int) f) << 1 );

И выше, f должно быть 256.0.

Теперь, очевидно, это проблематично, если вы начнете с 128.4, так как при броске выпадет .4. Вы, возможно, не хотите использовать поплавок на первом месте.

...