С битовое смещение - PullRequest
       1

С битовое смещение

2 голосов
/ 25 сентября 2011

Полагаю, sizeof (char) - один байт.Затем, когда я пишу следующий код,

    #include<stdio.h>

    int main(void)
    {
       char x = 10;

       printf("%d", x<<5);
    }

На выходе получается 320

Мой вопрос: если длина символа - один байт, а значение равно 10, оно должно быть:

0000 1010

Когда я сдвигаюсь на 5, не должно ли оно стать:

0100 0001

, почему вывод 320, а не 65?

Я использую gcc в Linux и проверилчто sizeof(char) = 1

Ответы [ 3 ]

12 голосов
/ 25 сентября 2011

В C все промежуточные продукты, которые меньше int, автоматически переводятся в int.Следовательно, ваш char увеличивается до 8 бит.

Таким образом, ваш 0000 1010 сдвигается вверх на 5 бит, чтобы получить 320. (ничего не сдвигается сверху)

Если вы хотите повернуть, вам нужно сделать две смены и маску:

unsigned char x = 10;

x = (x << 5) | (x >> 3);
x &= 0xff;

printf("%d", x);

Можно сделать это быстрее, используя встроенную сборку или, если компилятор это поддерживает, встроенные.

0 голосов
/ 07 сентября 2013

Мистик прав.Если вы сделаете

char x = 10;
printf("%c", x);

Он напечатает «@», который, если вы проверите свою таблицу ASCII, равен 64.

0000 1010 << 5 = 0001 0100 0000

У вас было переполнение, но поскольку оно было повышено доint, он просто напечатал номер.

0 голосов
/ 25 сентября 2011

Потому что вы описываете вращение, а не сдвиг. 0 всегда сдвигается влево.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...