Побитовое «не» нуля равно нулю, когда ноль рассчитывается сдвигами

0

Почему ~((~0ULL) >> size << size) для size от 1 включительно до 64 включительно оценивается до 0 при size = 64?

Теги:

2 ответа

2

Смещение значением, большим или равным размеру значения, является неопределенным поведением.

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

По причинам, которые мне не совсем понятны, например, даже в x86 смена сборки выполняется по модулю размера регистра. Я не инженер по оборудованию, но, вероятно, это была самая эффективная вещь.

Другим неудачным ограничением является то, что смещение по отрицательному счету - это не то же самое, что смещение положительным счетом в противоположном направлении и вместо этого просто UB. Это иногда требует добавления дополнительных условных выражений в вычислениях.

  • 0
    Сдвиг больше или равный размеру - неопределенное поведение.
  • 0
    @KeithThompson: спасибо, исправлено
1

Потому что то, что вы делаете, - это неопределенное поведение. Не переносите 64-битное целое число на 64 места.

Отредактировано для добавления: Почему операция сдвига влево вызывает Undefined Behavior, когда левый операнд имеет отрицательное значение?

Ещё вопросы

Сообщество Overcoder
Наверх
Меню