Transmitindo um tipo de grande número para um tipo menor

Eu dei uma boa olhada ao redor e não consigo encontrar uma pergunta semelhante, então peço desculpas se já foi perguntado antes.

Eu estou apenas brincando com tipos e números e estou querendo saber se o seguinte comportamento pode ser garantido. Se eu declarar 2 variables ​​como

unsigned char BIT_8 = 0; unsigned short int BIT_16 = 0xFF01; 

e faça o seguinte (ignorando o estilo C convertido por agora, a menos que isso possa afetá-lo?)

 cout << "BIT_16: " << BIT_16 << "\n"; cout << "BIT_8: " << (int)BIT_8 << "\n"; BIT_8 = BIT_16; cout << "BIT_8 after: " << (int)BIT_8 <> 8; cout << "BIT_8 after shift: " << (int)BIT_8 << "\n"; 

Eu recebo a saída

 BIT_16: 65281 BIT_8: 0 BIT_8 after: 1 BIT_8 after shift: 255 

É garantido que, se eu transmitir um tipo de 16 bits para um tipo de 8 bits, o byte inicial será perdido? ou é indefinido e os resultados acima são de sorte?

É garantido que, se eu transmitir um tipo de 16 bits para um tipo de 8 bits, o byte inicial será perdido?

Depende se você está trabalhando com tipos assinados ou não assinados (consulte a seção 4.7 §2 e §3):

Se o tipo de destino não for assinado , o valor resultante será o menor inteiro não assinado congruente ao inteiro de origem (módulo 2 ^ n, em que n é o número de bits usados ​​para representar o tipo não assinado). [Nota: Em uma representação de complemento de dois, essa conversão é conceitual e não há alteração no padrão de bits (se não houver truncamento).]

Se o tipo de destino for assinado , o valor permanecerá inalterado se puder ser representado no tipo de destino (e na largura do campo de bits); caso contrário, o valor será definido pela implementação .

Como você está trabalhando com tipos não assinados, o comportamento é bem especificado.