弄清楚这个按位 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 位的。
我对 3
和 4
行有点困惑。
我们将 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。
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 位,并用 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。