LINUX.ORG.RU

qt crc


0

1

Доброго всем времени суток.

Никак не могу понять почему в Qt5 в следующем коде

quint16 crc=0xffff;
char byte=0xfa;
crc ^= byte;
crc=0x05 а не 0xff05 как ожидается

подскажите пожалуйста.

кажется разобрался - вместо char надо писать quint8, тогда работает. Но почему с char-ом не работает? Какая ему разница, ведь биты есть биты?

seijuurou ()
Ответ на: комментарий от seijuurou

Но почему с char-ом не работает? Какая ему разница, ведь биты есть биты?

Потому что char - signed.

Deleted ()
Ответ на: комментарий от Deleted
$ cat test.c 
#include <stdio.h>

int main()
{
    char x = 0xfa;
    printf("%x\n", (unsigned int) x);
    return 0;
}

$ gcc -Wall -Wextra -o test test.c

$ ./test 
fffffffa
Deleted ()
Ответ на: комментарий от Deleted

и что? signed - это старший бит, который в xor так же должен участвовать. или это только мои хотелки и измышления, а после этого знака он тупо отбрасывает всё?

seijuurou ()
Ответ на: комментарий от seijuurou

На самом деле я не совсем правильно написал. Вот тут

crc ^= byte;
У тебя сначала char byte приводится к int. Раз оба типа знаковые, то число остаётся отрицательным, то есть у тебя в старших байтах вместо ожидаемых нулей оказываются 0xff. Затем uint16_t crc тоже приводится к инту (на этот раз без приключений), затем оба инта XORятся, а затем результат урезается обратно до uint16_t и заталкивается в crc.

Deleted ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.