Я не понимаю поведение битшифтинга в этом примере - PullRequest
0 голосов
/ 21 ноября 2018

Я понимаю, что смещение означает перемещение каждого бита влево или вправо соответственно, но когда я пытаюсь сместить 0x30 на 4 позиции влево, я получаю 0x300 или 00110000000 в двоичном виде (мой желаемый вывод будет 0000 0000). Почемуэто ведет себя так?Мой код на языке C:

int main(void){
 unsigned int a;
 scanf("%x",&a);
 printf("%b",a<<4);
}

Входные данные: 30 Выходные данные: 300 Ожидаемый выходной результат: 0 Редактировать: я ожидал бы этот вывод, если бы я использовал более 1 байта для моей назначенной переменной, но беззнаковое int ровно 1 байти 0x300 составляет 12 бит.

Ответы [ 2 ]

0 голосов
/ 21 ноября 2018

a - это int длиной (обычно) 32 бита.

Ожидается значение 0x300 для int.

Даже если вы используете uint8_t для a, вам нужно снова привести результат обратно к uint8_t, чтобыувидеть ожидаемый результат.

int main(void){
  uint8_t a;
  scanf("%hhx",&a);  // you need hhx to read unsigned char (C99 only) 
  printf("%hhx",(uint8_t) (a<<4));
}

Для вашего сведения, если вы не ввели тип, значение a<<4 будет повышено до int, а 0x300 будет отображаться

0 голосов
/ 21 ноября 2018

0x30 является шестнадцатеричным, а 0000000000110000 - двоичным.Если вы сдвинете 4 бита, вы получите свой результат 0x300 или 0000001100000000.

Чтобы ответить на ваши изменения, unsigned int не займет 1 byte.Он занимает столько же байтов, сколько int.Что в вашем случае это, вероятно, 4 байта или 32 бита.

Причина, по которой номер отображается с 2 или 3 hex цифрами, потому что 0 в начале не печатаются.Но на самом деле это число 0030(hex).

В любом случае, вы можете проверить размер, используя sizeof.

РЕДАКТИРОВАТЬ: Если вы хотите взять 1 байт, см. Ответ Ришикеша.

...