C биты, сдвигающие короткие целые - PullRequest
1 голос
/ 12 февраля 2010

Почему результат

include <stdio.h>
int main()
{
    unsigned short int i = 0xff ;
    unsigned short int j;
    j= i<<2;
    printf("%x n%x\n", i, j);
    return 0;
}

это j = 3fc?

, если и i, и j являются короткими значениями типа int, то есть они имеют значение 2 байта, поэтому j shouldnt = fc ??

спасибо заранее за объяснения. ~
~

Ответы [ 6 ]

4 голосов
/ 12 февраля 2010

Сдвиг 0xff влево на два бита выглядит так:

    0000 0000 1111 1111
       0    0    f    f

    0000 0011 1111 1100     -- Shifted left 2 bits.
       0    3    f    c

То есть 0x00ff << 2 = 0x03fc. Все выглядит так, как должно быть. </p>

4 голосов
/ 12 февраля 2010

Нет, 0x3fc правильно. Обратите внимание, что байт состоит из двух шестнадцатеричных цифр, поэтому короткое (16-битное) значение имеет всего 4 шестнадцатеричных цифры.

1 голос
/ 12 февраля 2010

3FC требует только 12 бит для хранения, поэтому его можно хранить в 2 байта.

1 голос
/ 12 февраля 2010
0xff << 2 == 0xff * 4 == 0x3fc == 1020

Даже если они 2-байтовые, им разрешено хранить это небольшое значение.

0 голосов
/ 12 февраля 2010

Может быть, это то, что вы на самом деле пытались написать? (Помните, что шестнадцатеричная цифра только 4 бита, то есть половина байта)

#include <stdio.h>
int main()
{
    unsigned short int i = 0xffff;
    unsigned short int j;
    j = i<<8;
    printf("%x  %x\n", i, j);
    return 0;
}

Это выводит ffff ff00

0 голосов
/ 12 февраля 2010

C ++ не дает никаких гарантий относительно количества байтов в unsigned short int. Фактически, это почти не дает никаких гарантий относительно размера любого типа, кроме char, который гарантированно равен 1 байту.

В этом случае это не имеет значения, потому что 3fc может быть успешно сохранен только в 2 байтах.

...