C,如果将无符号长按位运算的结果与0进行比较的条件被评估为false,尽管应为true(0==0为false)



versionNumberAndPlaceNumber0xFFFF00,则未输入以下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作为输出,因此该条件看起来是假的。

167769600xFFFF000xFFFF00AND0xFF0

为什么0 == 0false

==运算符的运算符优先级高于&(按位AND(,因此您的条件等于此

if(versionNumberAndPlaceNumber & (0xFFUL == 0UL)) // 0xFFFF00 & 0 -> 0 -> false

运算符优先级描述了操作的发生顺序。这与数学课上的PEMDAS相同,是为了减少所需的括号数量。==运算符的优先级为9,&的优先级为10,因此==运算符首先获取其参数。

这意味着(a & b == c)(a & (b == c))相同,这不是您所期望的。

相关内容

最新更新