Чар, кажется, int независимо от того, что я делаю, не уверен, что происходит - PullRequest
1 голос
/ 23 января 2020

Вот мой код, я пытаюсь создать битовые поля со структурой и упорядочить их сначала lsB:

struct rhmp{
    unsigned int type1:4;
    unsigned int dstPort:14;
    unsigned int srcPort:14;
};

struct rhmp rhmp1;

rhmp1.type1 = 3;
rhmp1.dstPort = 122;
rhmp1.srcPort = 300;

char firstByte = (((char)rhmp1.type1 & 0xF) << 4) + (((char)rhmp1.dstPort & 0x3C00)>>10);
char secondByte = (rhmp1.dstPort & 0x3FC) >> 2;
char thirdByte = ((rhmp1.dstPort & 0x3) << 6) + ((rhmp1.srcPort & 0x3F00)>>8);
//char thirdByte = 0x81;
char fourthByte = (rhmp1.srcPort & 0xFF);

char messageToSend[4] = {firstByte, secondByte, thirdByte, fourthByte};

printf("RHMP byte 1: %X\n",firstByte);
printf("RHMP byte 2: %X\n",(int)secondByte);
printf("RHMP byte 3: %X\n",(int)thirdByte);
printf("RHMP byte 3 should be: %X\n",(int) ((rhmp1.dstPort & 0x3) << 6) + ((rhmp1.srcPort & 0x3F00)>>8));
printf("RHMP byte 4: %X\n",(int)fourthByte);`

Это распечатывает следующее:

RHMP byte 1: 30
RHMP byte 2: 1E
RHMP byte 3: FFFFFF81
RHMP byte 3 should be: 81
RHMP byte 4: 2C

Независимо от того, что я делаю, байт 3 кажется 32-битным значением. Даже когда я назначаю его 0x81, он не работает. Что здесь происходит?

1 Ответ

3 голосов
/ 23 января 2020

Неквалифицированный char является типом со знаком в вашей системе - он зависит от реализации - и неквалифицированный int всегда относится к signed int.

thirdByte имеет значение -127 , Когда вы приводите его к signed int, он выдает signed int с тем же значением (-127).

Вы можете решить свою проблему, используя unsigned char вместо char.

...