Я знаю, что можно назначить символ без знака для короткого знака без знака, но я хотел бы иметь больше контроля над тем, как фактически назначаются биты для короткого знака без знака.
unsigned char UC_8;
unsigned short US_16;
UC_8 = 0xff;
US_16 = (unsigned char) UC_8;
Биты из UC_8 теперь размещаются в младших битах US_16. Мне нужно больше контроля над преобразованием, так как приложение, над которым я сейчас работаю, связано с безопасностью. Можно ли управлять преобразованием с помощью битовых операторов? Таким образом, я могу указать, где 8 битов без знака должны быть помещены в большую 16-битную переменную без знака.
Я предполагаю, что это было бы возможно при маскировке в сочетании с каким-либо другим битовым оператором, возможно, смещением влево / вправо.
UC_8 = 0xff;
US_16 = (US_16 & 0x00ff) ?? UC_8; // Maybe masking?
Я пробовал разные комбинации, но не нашел умного решения. Я использую ANSI C и, как было сказано ранее, мне нужно больше контроля над тем, как на самом деле устанавливаются биты в большей переменной.
EDIT:
Моя проблема или проблема связана с функцией генерирования CRC. Он будет и должен всегда возвращать беззнаковое короткое замыкание, поскольку иногда он рассчитывает 16-битный CRC. Но иногда вместо этого следует рассчитать 8-битный CRC и поместить 8-битный код в восемь младших битов в 16-битную переменную возврата. А на восьмерке MSB должны тогда содержать только нули.
Я хотел бы сказать что-то вроде:
US_16(7 downto 0) = UC_8;
US_16(15 downto 8) = 0x00;
Если я просто приведу его к типу, могу ли я гарантировать, что биты всегда будут размещаться в младших битах в переменной большего размера? (На всех разных архитектурах)