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