2017-01-29 2 views
0

Мой первоначальный код взять х и превратить его в самый большой отрицательный междунар былпобитовое смещение с логическим ИЛИ в C

*x = 1 <<31 | ~ 1<<31; 

который работает, но когда я попытался просто использовать

*x = 1 <<31; 

Он возвратил такой же ответ может кто-то объяснить, почему это так?

+1

Если ваш 'int' меньше 32 бит, он вызывает неопределенное поведение для слишком большого количества сдвигов. В противном случае, если это 32 бита, он вызывает неопределенное поведение, потому что '1 << 31' не может быть представлен в вашем' int'. И зачем использовать указатель? Предоставьте [mcve] и прочитайте [ask]. – Olaf

+0

Как определено x? это переменная или указатель? это int, long, ...? – recycler

+0

Даже когда '1 << 31 | ~ 1 << 31' "работает" (интервал фиксирован как менее двусмысленный), он не делает то, что, по вашему мнению, делает. Хуже того, он работает * потому что * он не делает то, что вы думаете, что он делает. – harold

ответ

1

Если ваш int на 32 бита на вашей архитектуре, наибольшее отрицательное значение int, очевидно, 0x80000000.
Давайте посмотрим на код и добавить скобки, чтобы показать приоритет операторов (это ключ здесь):

*x = 1 <<31 | ~ 1<<31 = (1 << 31) | ((~1) << 31) 

Оценка экспрессии ((~1) << 31) дает результат 0x00000000.
Таким образом, конечный результат: 1 << 31 = 0x80000000.

+0

Большое спасибо Laurent .... это имеет смысл сейчас ... Я забыл о приоритете – Ibeabuchi

+0

@Ibeabuchi Если этот ответ помог вам решить вашу проблему, пожалуйста, примите ответ. –

+0

@Ibeabuchi спасибо :) –

0

Ну, если вы знаете дополнение двух, то вы знаете, что для 32-битного целого числа 0x80000000 должно быть самым большим отрицательным значением, потому что если вы переверните биты и добавьте один из 0x80000000, вы получите 0x7fffffff. добавьте один, и вы получите 0x80000000, наибольшее отрицательное число возможно с 32 бит. У этого есть 1 в MSB, и нет никакого способа получить больше, чем это, учитывая, что начальное число должно немного сохранить знак. Ваш исходный код просто заполняет int 1, а затем сдвигает более 31, что дает такое же конечное значение, как * x = 1 < < 31;

Смежные вопросы