В настоящее время я дохожу до главы 2 языка программирования C (K&R) и читаю о побитовых операциях.
Вот пример, который вызвал мое любопытство:
x = x & ~077
Предполагая 16-битную длину слова и 32-битный тип, я думаю, что 077 сначала будет преобразовано в:
0000 0000 0011 1111 (16 bit signed int).
Затем это будет дополнено:
1111 1111 1100 0000.
Мой вопрос в том, что произойдет дальше для различных возможных типов x? Если x является подписанным целым числом, ответ тривиален. Но если x является длинным со знаком, я предполагаю, что ~ 077 станет:
1111 1111 1111 1111 1111 1111 1100 0000
следующие 2s дополнение, чтобы сохранить знак. Это правильно?
Кроме того, если x является unsigned long, ~077 станет:
0000 0000 0000 0000 1111 1111 1100 0000
Или сначала ~077 будет преобразован в длинный со знаком:
1111 1111 1111 1111 1111 1111 1100 0000
... после чего он преобразуется в unsigned long (без изменения битов)?
Любая помощь поможет мне уточнить, будет ли эта операция всегда устанавливать только последние 6 битов в ноль.