弄清楚这个按位AND和LSL在C中到底做了什么 1。长内温; 2.int乘积=-1; 3.temp=(长整型)产品&0xFFFFFFFF; 4.在第3行,出现以下情况:
由于类型转换运算符的值高于弄清楚这个按位AND和LSL在C中到底做了什么 1。长内温; 2.int乘积=-1; 3.temp=(长整型)产品&0xFFFFFFFF; 4.在第3行,出现以下情况:,c,binary,hex,bitwise-operators,bit-shift,C,Binary,Hex,Bitwise Operators,Bit Shift,由于类型转换运算符的值高于&运算符,因此程序首先将变量product中数字-1的32位表示形式转换为数字-1的临时64位表示形式。它通过高32位实现这一点。由于符号位的数字为1,因此上面的32位将用1填充,因此临时64位值现在由64个1组成。现在,该临时值与0xFFFFFFFF进行and运算,这将保持较低的32位不变,并将较高的32位置零。因此,现在临时值的值为0x00000000FFFFFF,它不再对应于-1,因为该值现在为正值,因为符号位(最高位)现在设置为零。此临时值的十进制值为42949
&
运算符,因此程序首先将变量product
中数字-1的32位表示形式转换为数字-1的临时64位表示形式。它通过高32位实现这一点。由于符号位的数字为1,因此上面的32位将用1填充,因此临时64位值现在由64个1组成。现在,该临时值与0xFFFFFFFF进行and运算,这将保持较低的32位不变,并将较高的32位置零。因此,现在临时值的值为0x00000000FFFFFF,它不再对应于-1,因为该值现在为正值,因为符号位(最高位)现在设置为零。此临时值的十进制值为4294967295。它现在被分配给变量temp
在第4行,发生以下情况:
变量temp中的值0x00000000FFFFFFFF现在左移32位,为0xFFFFFF00000000。此新值现在已指定给临时值。由于符号位(最高位)现在再次设置为1,因此该值为负值,但不再为-1。它的值现在是十进制的-4294967296。有关负数如何以二进制表示的更多信息,请参阅。在第3行,出现以下情况: 由于类型转换运算符的值高于
&
运算符,因此程序首先将变量product
中数字-1的32位表示形式转换为数字-1的临时64位表示形式。它通过高32位实现这一点。由于符号位的数字为1,因此上面的32位将用1填充,因此临时64位值现在由64个1组成。现在,该临时值与0xFFFFFFFF进行and运算,这将保持较低的32位不变,并将较高的32位置零。因此,现在临时值的值为0x00000000FFFFFF,它不再对应于-1,因为该值现在为正值,因为符号位(最高位)现在设置为零。此临时值的十进制值为4294967295。它现在被分配给变量temp
在第4行,发生以下情况:
变量temp中的值0x00000000FFFFFFFF现在左移32位,为0xFFFFFF00000000。此新值现在已指定给临时值。由于符号位(最高位)现在再次设置为1,因此该值为负值,但不再为-1。它的值现在是十进制的-4294967296。有关负数在二进制中的表示方式的更多信息,请参阅。第3行之后,
temp
的高32位应为0,低32位应为1。您可以通过使用%016lx
格式说明符打印temp
来确认。long int
的最小大小为32位。为确保64位,请使用long-long-int.
但假设64位,int-product=-1
将符号扩展到64位,0xffffffffffffff
并且您屏蔽了上面的32位,留下0xFFFFFFFF
。将其左移32位,得到的0xFFFFFFFF00000000
为十进制-4294967296
。在第3行之后,temp
的高32位应为0,低32位应为1。您可以通过使用%016lx
格式说明符打印temp
来确认。long int
的最小大小为32位。为确保64位,请使用long-long-int.
但假设64位,int-product=-1
将符号扩展到64位,0xffffffffffffff
并且您屏蔽了上面的32位,留下0xFFFFFFFF
。将其左移32位,得到的0xFFFFFFFF00000000
为十进制-4294967296
。
1. long int temp;
2. int product = -1;
3. temp = (long int)product & 0xFFFFFFFF;
4. temp = temp << 32;