Операция сдвига вправо на 32-битной переменной - PullRequest
2 голосов
/ 31 марта 2020

Я хочу сделать правое смещение 33 для переменной 32 и сохранить результат в переменной с плавающей точкой.

Предположим, значение равно 1717986812. Когда мы сместим вправо на 33, мы ожидаем, что значение быть 0,2.

Но когда я делаю 1717986812 / (1 << 33), я получаю еще одно огромное целочисленное значение. Я знаю, что результат 1 << 33 не может быть сохранен в 32-битном значении. Итак, я попробовал 17917986812 / (1UL << 33), но не получил правильных результатов. Я считаю, что что-то должно быть сделано в отношении преобразования формата. Но не мог понять это. </p>

1 Ответ

7 голосов
/ 31 марта 2020

Предположим, значение равно 1717986812. Когда мы сместимся вправо на 33, мы ожидаем, что значение будет равно 0,2.

Подождите, подождите? Нет? Сдвиг битов - это действие integer , поэтому появление результата с плавающей точкой будет очень волшебным. Сдвиг целого числа вправо на большее количество битов, из которых состоит целое число, "логически" приведет к 0, но в C оно оказывается неопределенным.

Если вы хотите разделить значение с плавающей запятой, просто сделайте так:

float x = 1717986812;
x /= powf(2, 33);
printf("got %g\n", x);

Это напечатано 0.2, когда я тестировал его онлайн.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...