В строке 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 в десятичном представлении. См. эту статью Википедии для получения дополнительной информации о том, как отрицательные числа представлены в двоичном виде.