почему байты меняются при сдвиге битов? - PullRequest
2 голосов
/ 12 августа 2010

Я играю со сдвигом битов.Я пытаюсь взять 32-битное int, сохранить каждый байт в массиве char, а затем восстановить int.Он работает так, как я думаю, за исключением того, что второй байт справа, кажется, переключил младший бит.Мой код:

int main() {
  char paus[2];
  char b[4] = "abc";
  int c = 6104;
  int d = 0xcccccccc;
  printf("c in hex: %x\n",c);
  printf("d in hex: %x\n",d);
  printf("b[0]: %x\nb[1]: %x\n",b[0]&0xff,b[1]&0xff);
  printf("b[2]: %x\nb[3]: %x/n",b[2]&0xff,b[3]&0xff);
  printf("\n");

  b[0] = c >> 24;
  b[1] = (c >> 16) & 0xff;
  b[2] = (c >> 8) & 0xff;
  b[3] = c & 0xff;
  printf("b[0]: %x\nb[1]: %x\n",b[0]&0xff,b[1]&0xff);
  printf("b[2]: %x\nb[3]: %x\n",b[2]&0xff,b[3]&0xff);
  printf("\n");

  d = (d << 8) + 0x15;
  printf("d in hex: %x\n",d);
  d = (d << 8) + b[1];
  printf("d in hex: %x\n",d);
  d = (d << 8) + b[2];
  printf("d in hex: %x\n",d);
  d = (d << 8) + b[3];
  printf("d in hex: %x\n",d);

  fgets(paus,2,stdin);
  return 0;
}

Вывод:

c в гекс: 17d8
d в гекс: cccccccc
b [0]: 61
b [1]: 62
b [2]: 63
b [3]: 0

b [0]: 0
b [1]: 0
b [2]: 17
b [3]: d8

d в гекс: cccccc15
d в гекс: cccc1500
d в гекс: cc150017
d в гекс: 150016d8

Все имеет смысл, за исключением того, почему второй байт справа меняется на 16 с битового сдвига 17 влево на 8 бит?15 и 00 байтов переносятся полностью, так почему же 17 байтов меняются?Спасибо!

1 Ответ

0 голосов
/ 12 августа 2010

Проблема в том, что ваш компилятор настроен на char как signed char. Попробуйте это:

d = (d << 8) + (unsigned char)b[3];
printf("d in hex: %x\n",d);

(Возможно, вы захотите сделать то же самое для других экземпляров.)

Кроме того, вы можете изменить объявление d:

unsigned char b[4] = "abc";
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...