Выяснить, что именно это побитовое AND и LSL делает в C - PullRequest
0 голосов
/ 10 октября 2019
1.  long int temp;
2.  int product = -1;

3.  temp = (long int)product & 0xFFFFFFFF;

4.  temp = temp << 32;

Я знаю, что temp является 64-разрядным, а product - 32-разрядным.

Я немного запутался в строках 3 и 4.

Мы приводим product как long int, что означает, что product должен быть представлен как 64-битный, и выполняется побитовое AND с 0xFFFFFFFF. Шестнадцатеричное представление 0xFFFFFFFF - это все 1, поэтому AND должно сохранять двоичное представление -1?

, поскольку -1 в двоичном виде - 1111111111111111, будет temp теперь 32 1 с последующими 32 0 или наоборот? Если первое, есть ли смысл делать сдвиг влево в строке 4?

Я в основном запутался по поводу преобразования 32-разрядного в 64-разрядное здесь и как это выглядит в двоичном формате.

1 Ответ

2 голосов
/ 10 октября 2019

В строке 3 происходит следующее:

Поскольку оператор приведения типа имеет более высокий приоритет оператора , чем оператор &, программа сначала преобразует 32-разрядное представление операторачисло -1 в переменной product для временного 64-разрядного представления числа -1. Это делается с помощью знака , расширяющего старших 32 бит. Поскольку знаковый бит имеет номер 1, старшие 32 бита будут заполнены 1 с, так что временное 64-битное значение теперь состоит из 64 1 с. Теперь это временное значение равно AND с 0xFFFFFFFF, который сохраняет младшие 32 бита нетронутыми и обнуляет верхние 32 бита. Итак, теперь временное значение имеет значение 0x00000000FFFFFFFF, которое больше не соответствует -1, поскольку значение теперь положительное, поскольку знаковый бит (старший бит) теперь установлен в ноль. Это временное значение имеет значение 4 294 967 295 в десятичном виде. Теперь она присвоена переменной temp.

. В строке 4 происходит следующее:

Значение в переменной temp, равное 0x00000000FFFFFFFF, теперь смещено влево на 32 бита,до значения 0xFFFFFFFF00000000. Это новое значение теперь назначено для temp. Поскольку знаковый бит (старший бит) теперь снова равен 1, значение является отрицательным, но больше не равно -1. Его значение в настоящее время составляет -4,294,967,296 в десятичном представлении. См. эту статью Википедии для получения дополнительной информации о том, как отрицательные числа представлены в двоичном виде.

...