Сохраняет ли C перенос битов из сдвига << или >>?

Я читал, что C держит вынос от смены, и это может быть найдено в специфичном для процессора.h.

Это правда, и я должен использовать это? или надо самому отрабатывать выноску?

2 ответа

Решение

Не существует стандартного способа доступа к битам переноса примитивных операций в C.

Вам также нужно выполнить сдвиг в больший тип данных:

uint16_t foo = ...;

uint32_t tmp = (uint32_t)foo << shift;
uint16_t result = (uint16_t)tmp;
uint16_t carry  = (uint16_t)(tmp >> 16);

или выполнив противоположный сдвиг:

uint16_t result = foo << shift;
uint16_t carry  = foo >> (16 - shift);

Обратите внимание, что этот второй метод вызывает неопределенное поведение, если shift == 0так что вам нужно разобраться с этим делом отдельно.

Стандарт С не обеспечивает доступа к выполнению работ в смену.
Некоторые, но не все реализации C имеют специфичные для процессора файлы.h или другие расширения, которые разрешают доступ.

Вы должны избегать использования функциональных возможностей из файлов процессора или расширений.h, где это практически возможно. Но если необходимо использовать, рассмотрите также написание решения C Standard, по крайней мере, как часть документации. см. Рекомендуемое решение @Oli Charlesworth.

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

Различные недостатки были указаны в моих ранее опубликованных примерах. Теперь я вижу их как зависящие от реализации. Там удалены.

Другие вопросы по тегам