Вопрос

Я инициализирую беззнаковое короткое значение int с помощью a = 0xff (все биты установлены).Затем я присваиваю b a>> 7, что должно дать результат (0000 0001), и это происходит.Однако странно то, что когда я присваиваю c a<<7, это не эквивалентно (1000 0000).Я протестировал это, выведя 0x80 (что равно 1000 0000) и c, но они не совпадают.

Вот некоторый код:

unsigned short int a = 0xff;
unsigned short int b = a>>7;
unsigned short int c = a<<7; // c should == 0x80

Я не уверен, в чем проблема.Любая помощь приветствуется.Спасибо.

P.S.Под "выводом" я подразумеваю вывод 0x80 и c в десятичной и шестнадцатеричной форме.

Это было полезно?

Решение

короткий int содержит 16, а не только 8 бит.

Таким образом, вы, скорее всего, получите "0111 1111 1000 0000" в результате 0xff<<7.

Другие советы

Не угадывайте типы битов, используйте <stdint.h>


Короткий ввод "обычно" имеет 16 бит.На самом деле, я почти уверен, что это всегда имеет 16, за исключением тех марсианских компьютеров, но это не то, что обещает стандарт.

Если вы хотите объявлять типы, которые имеют определенное количество битов, соответствующий метод:

#include <stdint.h>

  int8_t  a;
 uint8_t  b;
 int16_t  x;
uint16_t  y;

Выполнение этого позволило бы избежать вашего не совсем правильного предположения о битовом представлении short.По какой-то причине Microsoft далека от соответствия стандарту C99 даже в таких простых вещах, как <stdint.h>.К счастью, проект поддерживает стандартную версию VC ++.

Я бы ожидал, что у вас получилось 0x7f80.Я думаю, что то, что вы хотели написать, это:

unsigned short int c = b<<7; // c should == 0x80

К сожалению, VC ++ (компилятор C) не имеет inttypes.h, поскольку он не полностью поддерживает C99.Вы должны использовать сторонние заголовки (напримерСтатья Пола Се.h).

Если вы хотите получить такой результат, вы можете отрезать порцию a << 7 больше 8-го младшего значащего бита, используя побитовые-и:

unsigned short int c = (a << 7) & 0xff;
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top