弄清楚这个按位 AND 和 LSL 在 C 中到底做了什么

Figuring out what exactly this bitwise AND and LSL does in C

1.  long int temp;
2.  int product = -1;

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

4.  temp = temp << 32;

我知道 temp 是 64 位的,而 product 是 32 位的。

我对 34 行有点困惑。

我们将 product 转换为 long int,这意味着 product 应该表示为 64 位,并用 0xFFFFFFFF 按位 AND . 0xFFFFFFFF的十六进制表示都是1的,所以AND应该保留-1的二进制表示?

因为 -1 在二进制中是 1111111111111111,所以 temp 现在是 32 1 后跟 32 0,反之亦然?如果是前者,在 4 行左移是否有意义?

我主要对这里 32 位到 64 位的转换以及它在二进制中的外观感到困惑。

在第 3 行,发生以下情况:

因为类型转换运算符具有更高 operator precedence than the & operator, the program first converts the 32-bit respresentation of the number -1 in the variable product to a temporary 64-bit representation of the number -1. It does this by sign extending 的高 32 位。由于符号位的编号为 1,因此高 32 位将被填充为 1,因此临时 64 位值现在由 64 个 1 组成。现在,该临时值与 0xFFFFFFFF 进行“与”运算,从而保持低 32 位不变并将高 32 位清零。因此,现在临时值的值为 0x00000000FFFFFFFF,不再对应于 -1,因为该值现在为正,因为符号位(最高位)现在设置为零。此临时值的十进制值为 4,294,967,295。现在分配给变量 temp.

在第 4 行,发生以下情况:

变量 temp 中的值,即 0x00000000FFFFFFFF,现在左移 32 位,变为值 0xFFFFFFFF00000000。这个新值现在分配给 temp。由于符号位(最高位)现在再次设置为 1,因此值为负,但不再是 -1。它的值现在以十进制表示形式为 -4,294,967,296。有关如何用二进制表示负数的详细信息,请参阅 this Wikipedia article