Почему результат unsigned char << unsigned char не является unsigned char

Я получаю результаты от сдвига влево, объяснения которым я не нашел.

unsigned char value = 0xff; // 1111 1111
unsigned char  = 0x01; // 0000 0001

std::cout << "SIZEOF value " << sizeof(value) << "\n"; // prints 1 as expected
std::cout << "SIZEOF shift " << sizeof(shift) << "\n"; // prints 1 as expected

std::cout << "result " << (value << shift) << "\n"; // prints 510 ???

std::cout << "SIZEOF result " <<  sizeof(value << shift) << "\n"; // prints 4 ???

Я ожидал, что результат будет 1111 1110 , но вместо этого я получил int (?) Со значением 1 1111 1110 .

Как можно сдвинуть биты беззнакового символа влево, чтобы биты были усечены и результат был 1111 1110?

Я пытаюсь прочитать серию байтов и интерпретировать их как целые числа разной длины (1-32 бита).

F0        F5
1111 0000 1111 0101 

может быть

0F (first 4 bits)
0F (next 8 bits)
05 (last 4 bits)

Связано ли это с тем фактом, что арифметика не выполняется с типами меньшими, чем int?

7
задан user1124809 3 January 2012 в 14:10
поделиться