Неожиданные результаты битового сдвига - PullRequest
3 голосов
/ 13 сентября 2009

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

Вот код:

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

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

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

Ответы [ 5 ]

9 голосов
/ 13 сентября 2009

короткое int имеет 16, а не только 8 бит.

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

6 голосов
/ 13 сентября 2009

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


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

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

#include <stdint.h>

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

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

2 голосов
/ 13 сентября 2009

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

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

0 голосов
/ 13 сентября 2009

Если вы хотите получить этот результат, вы можете отрубить часть a << 7 больше 8-го младшего разряда, используя битовые-and:

unsigned short int c = (a << 7) & 0xff;
0 голосов
/ 13 сентября 2009

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

...