2014-11-22 4 views
6

Я новичок в этом, поэтому я начну с того, что, когда я просматривал какой-то код, я понял, что эта функция не имеет для меня никакого смысла.Преобразование unsigned char в int и short

Как вы можете видеть, эта конкретная функция использует побитовые операторы для преобразования 4 неподписанных элементов char в целое число.

// Преобразует массив из четырех символов в целое, используя мало-Endian образуют

int toInt(const char* bytes) { 
    return (int)(((unsigned char)bytes[3] << 24) | 
       ((unsigned char)bytes[2] << 16) | 
       ((unsigned char)bytes[1] << 8) | 
       (unsigned char)bytes[0]); 
} 

short toShort(const char* bytes) { 
    return (short)(((unsigned char)bytes[1] << 8) | 
        (unsigned char)bytes[0]); 
} 

Я уже знаю, как побитовое операторы и как символ использует 1 байт и INT использует 4 байта. Почему бы перемещать char биты в 24 бита влево и чем просто явно преобразовать его в int, преобразовать его в int? Почему для этой функции нужны побитовые операторы?

Эта функция выходит за рамки моего понимания, пожалуйста, объясните этот код и как он работает или, по крайней мере, предоставит мне ссылку, которая объясняет это.

Я искал всюду для объяснения, но не смог найти его.

Возможно, это достаточно простое объяснение.

+0

Использование оператора << на типе короче междунар автоматически способствует вход в int. Окончательный набор не нужен. –

ответ

6

Почему для этой функции нужны побитовые операторы?

Побитовые операторы используются для «сборки» четырехбайтового числа из четырех однобайтовых чисел.

Допустим, у вас есть четыре 8-разрядных чисел, например:

aaaaaaaa 
bbbbbbbb 
cccccccc 
dddddddd 

Сдвиги дать вам это:

aaaaaaaa000000000000000000000000 
00000000bbbbbbbb0000000000000000 
0000000000000000cccccccc00000000 
000000000000000000000000dddddddd 

побитовое оператор OR позволяет сделать одно число из этих четырех детали, потому что OR -в любом бите x с нулевым выводом x. Если вы выставляете номера четыре байта, как показано выше, есть только один ненулевой бит в каждой позиции, так побитовое OR с получением желаемого результата:

aaaaaaaabbbbbbbbccccccccdddddddd 
+0

Я попытался подытожить этот ответ в комментарии, но не смог. Хороший ответ. –

+1

в этом случае как беззнаковый сдвиг символов 24, 16, 8 бит для получения целых чисел? Это не имеет никакого смысла. – Snake

+0

@Snake: справедливый вопрос. Прочитайте «Конверсии» по адресу http://en.cppreference.com/w/cpp/language/operator_arithmetic: «перед любым другим действием (но после преобразования lvalue-to-rvalue, если применимо) операнд претерпевает целую рекламу». – usr2564301

Смежные вопросы