Очевидно, *(cra+3)
- это char
значения '\xdd'
. Поскольку char
подписано, это фактически означает -35 (0xdd
в дополнении 2), то есть 0x ... fffffdd. Ограничение этого значения до 16-битного дает 0xffdd, то есть 65501.
Вам нужно сделать его unsigned char
, чтобы оно давало число в диапазоне 0–255:
num = (unsigned char)cra[3];
Примечание:
1. Подпись char
определяется реализацией, но обычно (например, в случае OP) она подписывается.
2. диапазоны signed char
, unsigned char
и unsigned short
определяются реализацией, но обычно они равны -128–127, 0–255 и 0–65535 соответственно.
3. преобразование из signed char
в unsigned char
фактически составляет -35 + 65536 = 65501.