在Beej 的网络编程指南中,有一个函数旨在提供一种可移植的方式来序列化 16 位整数。
/*
** packi16() -- store a 16-bit int into a char buffer (like htons())
*/
void packi16(unsigned char *buf, unsigned int i)
{
*buf++ = i>>8; *buf++ = i;
}
我不明白为什么该语句*buf++ = i;
是可移植的,因为将无符号整数 ( i
) 分配给无符号字符 ( *buf
) 会导致缩小转换。
- C++ 标准是否保证在这样的转换中,
unsigned int
总是被截断并且它的最低有效 8 位被保留在unsigned char
? 如果没有,是否有任何解决问题的首选方法?将功能体更改为以下内容是否足够?
*buf++ = (i>>8) & 0xFFFFU; *buf++ = i & 0xFFFFU;