versionNumberAndPlaceNumber
为0xFFFF00
,则未输入以下if
的真实情况:
if(versionNumberAndPlaceNumber & 0xFFUL == 0UL) {
为什么会这样?
下面是一段较长的代码摘录:
if(bytes_received == 27) { // the data size of "struct bee" (padded), version number (8 bits) and place number of struct place
printf("n27n");
unsigned long versionNumberAndPlaceNumber = 0;
memcpy(&versionNumberAndPlaceNumber, &(read[24]), 8); // read 8 = sizeof(long) on x64 bytes, hope it's faster than transferring less bytes on x64 (into possibly a register)
/* memcpy copies bytes from increasing source address to increasing destination address, x64 this is supposed to run on is Little Endian thus for example [0xFF, 0x00, ...] as an unsigned long is ...0000000011111111 = 255 */
printf("n%lun", versionNumberAndPlaceNumber);
if(versionNumberAndPlaceNumber & 0xFFUL == 0UL) { // version 0 of data for version 0 of this server
printf("nv correctn");
unsigned long location[3];
(注意读取缓冲区为32字节。(
这是输出:
27
16776960
调试:
代替打印versionNumberAndPlaceNumber
,我还打印了整个if
条件(指示%d
而不是%lu
(,并得到0
作为输出,因此该条件看起来是假的。
而16776960
=0xFFFF00
,0xFFFF00
、AND
、0xFF
为0
。
为什么0 == 0
是false
?
==
运算符的运算符优先级高于&
(按位AND(,因此您的条件等于此
if(versionNumberAndPlaceNumber & (0xFFUL == 0UL)) // 0xFFFF00 & 0 -> 0 -> false
运算符优先级描述了操作的发生顺序。这与数学课上的PEMDAS相同,是为了减少所需的括号数量。==
运算符的优先级为9,&
的优先级为10,因此==
运算符首先获取其参数。
这意味着(a & b == c)
与(a & (b == c))
相同,这不是您所期望的。