Почему ~((~0ULL) >> size << size)
для size
от 1 включительно до 64 включительно оценивается до 0 при size = 64
?
Смещение значением, большим или равным размеру значения, является неопределенным поведением.
Вероятно, это стандарт, чтобы поддерживать работу с переключением достаточно быстро и просто отображать основные аппаратные операции.
По причинам, которые мне не совсем понятны, например, даже в x86 смена сборки выполняется по модулю размера регистра. Я не инженер по оборудованию, но, вероятно, это была самая эффективная вещь.
Другим неудачным ограничением является то, что смещение по отрицательному счету - это не то же самое, что смещение положительным счетом в противоположном направлении и вместо этого просто UB. Это иногда требует добавления дополнительных условных выражений в вычислениях.
Потому что то, что вы делаете, - это неопределенное поведение. Не переносите 64-битное целое число на 64 места.
Отредактировано для добавления: Почему операция сдвига влево вызывает Undefined Behavior, когда левый операнд имеет отрицательное значение?