Возможно, вы захотите использовать 64-битную математику.Согласно стандарту «C» результат сдвига переменной с N битами определяется только тогда, когда число сдвигов меньше размера переменной (0..N-1)
Выполнение сдвига включено(~ 0) (целое число, обычно 32-битное), приведет к неопределенному поведению для ~ n + 33 (n = 0), поскольку ~ n + 33 = 32, выше предела 31.
Изменение кодадля использования (~ 0L) выдает запрошенный результат маскировки (0) = 0
При условии, что вы работаете в универсальном Linux - gcc по умолчанию будет использовать 32-битное целое число, 64-битную длину и 64-битный указатель.
include <stdio.h>
int masking(int n) {
return (~0UL)<<(~n+33);
}
void main(void)
{
for (int i=0 ; i<4 ; i++) {
printf("M(%d)=%x\n", i, masking(i)) ;
}
}
Выход:
M(0)=0
M(1)=80000000
M(2)=c0000000
M(3)=e0000000