Beejの Guide to Network Programmingには、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;