我知道可以将unsigned char分配给unsigned short,但我想更多地控制这些位实际如何分配给unsigned short。
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,如前所述,需要更多控制如何在较大的变量中设置这些位。
编辑: 我的问题或疑虑来自CRC生成功能。它将始终返回无符号短路,因为它有时会计算出16位CRC。但有时它应该计算一个8位CRC,并将8位置于16位返回变量中的8个LSB上。然后八个MSB应该只包含零。
我想说的是:
US_16(7 downto 0) = UC_8;
US_16(15 downto 8) = 0x00;
如果我只是对它进行类型转换,我可以保证这些位总是放在较大变量的低位吗? (在所有不同的架构上)
答案 0 :(得分:3)
你是什么意思,“控制”?
C标准明确地定义了无符号二进制格式的位位置和重要性。根据数字定义,16位变量的某些位为“低”,它们将保持8位变量的模式,其他位设置为零。没有歧义,没有摆动的空间,没有别的东西可以控制。
答案 1 :(得分:0)
也许旋转位可以帮助你:
US_16 = (US_16 & 0x00ff) | ( UC_8 << 8 );
比特的结果将是:
C - UC_8位
S - US_16位
CCCC CCCC SSSS SSSS,版本:SSSS SSSS是US_16的最后8位
但如果UC_8为1且US_16为0,那么US_16将为512.你的意思是这个吗?
US_16 = (US_16 & 0xff00) | ( UC_8 & 0x00ff );
答案 2 :(得分:0)
如果使用ansi C很重要,并且不限于特定的实现,那么你不应该假设sizeof(short)== 2.而且为什么还要将unsigned char转换为unsigned char(同样的事情) )?虽然现在假设char是8位可能是安全的,尽管这并不能保证。
uint8_t UC_8;
uint16_t US_16;
int nbits = ...# of bits to shift...;
US_16 = UC_8 << nbits;
显然,如果你移动超过15位,它可能不是你想要的。如果您需要实际重新排列位,而不是将它们移动到某个位置,则必须单独设置它们
int sourcebit = ...0 to 7...;
int destinationbit = ...0 to 15...;
// set
US_16 |= (US_8 & (1<<sourcebit)) << (destinationbit - sourcebit);
// clear
US_16 &= ~((US_8 & (1<<sourcebit)) << (destinationbit - sourcebit));
注意:刚写完,没试过。可能不是最优的。等等等等等等。但这样的事情会起作用。
答案 3 :(得分:0)
US_16=~-1|UC_8;
这是你想要的吗?