C, если условие сравнения результата беззнаковой длинной побитовой операции с 0 оценивается как ложное, хотя ожидалось истинное (0 == 0 ложно) - PullRequest
1 голос
/ 06 апреля 2020

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("\n27\n");
                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%lu\n", versionNumberAndPlaceNumber);
                if(versionNumberAndPlaceNumber & 0xFFUL == 0UL) {          // version 0 of data for version 0 of this server
printf("\nv correct\n");
                    unsigned long location[3];

(Обратите внимание, что буфер чтения составляет 32 байта.)

А вот вывод:

27

16776960

.

Отладка:

Вместо печати versionNumberAndPlaceNumber Я также напечатал все условие if (указывая %d вместо %lu) и получил 0 в качестве вывода, таким образом, условие представляется ложным.

Но 16776960 = 0xFFFF00 и 0xFFFF00 AND 0xFF равно 0.

Почему 0 == 0 false?

Ответы [ 2 ]

1 голос
/ 06 апреля 2020

Приоритет оператора описывает порядок, в котором будут выполняться операции. Это то же самое, что и PEMDAS в классе математики, и должно уменьшить количество необходимых скобок. Оператор == имеет приоритет 9, & приоритет 10, поэтому оператор == сначала получает свои аргументы.

Это означает, что (a & b == c) совпадает с (a & (b == c)), это не то, что вы ожидали.

1 голос
/ 06 апреля 2020

== оператор имеет более высокий приоритет оператора, чем & (побитовое И), поэтому ваше условие равно этому

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